无界面Activity或者APP的实现

最近在做一个谷歌语音调用APP设置闹钟的Issue,查看官方文档发现谷歌语音发送Intent给App时需要启动一个Activity,能不能使用Service或者广播去接收Intent呢?答案是不行的,使用普通的Activity有一个问题:每次语音发送Intent给APP的Activity的时候都要启动一次Activity,并且在无法接收到来自Activity的返回信息时,谷歌语会不断发送Intent,直到接收到返回信息。如果Activity没有立刻返回信息给Activity,这个Activity会不断启动,甚至会导致系统奔溃。加上通过谷歌语音进行的操作,还要启动APP的Activity使之可见,体验非常不好。于是想写一个没有界面的Activity,使这个Activity的java代码执行,界面又可以不显示出来。这种情况是可以实现的。

1. 首先新建一个Activity,使之继承Activity,不能使其他的,比如AppCompatActivity(带actionbar或者toolbar)的主题与activity不搭导致app运行错误。

public class MainActivity extends Activity

2. 在清单文件AndroidManifest里面添加这个Activity的主题。

android:theme="@android:style/Theme.NoDisplay"

如果需要做一个无界面APP,可以把这个APP的图标和后台任务隐藏掉,如果不隐藏掉,点击应用对给用户“应用无响应”的假象。

<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:launchMode="singleInstance" 
android:excludeFromRecents="true">   //后台任务图标设置为true
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    //桌面启动图标去除
intent-filter>
Activity>

3. 最后回到Activity,重写onResume()方法,在onResume()方法里杀死Activity(视自己实现的功能而定。好像在API 19和以下的手机不用添加finish(),在API 19以上的手机,如果不加finish()则会出现运行不成功的问题,所以为了保险起见,还是要在onResume()方法里面加上finish())

@Override
    protected void onResume() {
        super.onResume();
        this.finish();
    }

谷歌语音设置闹钟和定时器的功能在国内并不多用,很难找到一个Demo,众所周知,谷歌服务在国内不可用的原因,国内开发者很少做这种功能。后续实现了功能,我会写一个Demo出来供大家参考。

你可能感兴趣的:(android)