问题场景
最近开发一个展示类应用项目,展示设备为若干个24小时运行的Android广告机。考虑到停电的情况该应用需要开机自启动。
背景知识
当Android启动时,会发出一个系统广播,内容为ACTION_BOOT_COMPLETED,它的字符串常量表示为 android.intent.action.BOOT_COMPLETED。
android开发中的基本概念:Activity。Activity简单的理解为android的视图,承载着android的人机交互。一个应用程序可以有多个Activity,其中有一个Activity为应用程序启动时最先启动的。 该Activity在AndroidManifest.xml中的具体形式如下。intent-filter中两项android.intent.action.MAIN 和 android.intent.category.LAUNCHER表示该activity为应用程序启动主界面。
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
到这里解决问题的思路就完整了,我们监听ACTION_BOOT_COMPLETED广播,并在监听逻辑中启动应用的对应的Main Activity。
前提条件
由于我们需要自己写广播接收逻辑,所以应用的打包只能采用“离线打包”,这样我们才能调用android原生的api。
示例
本地离线打包项目导入,环境配置
AndroidMainfest.xml中添加开机启动权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
创建一个广播接收类
package io.dcloud.yourapp;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import io.dcloud.PandoraEntry;
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String action_boot="android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(action_boot)){
// 注意H5+SDK的Main Activity为PandoraEntry(见AndroidMainfest.xml)
Intent bootMainIntent = new Intent(context, PandoraEntry.class);
// 这里必须为FLAG_ACTIVITY_NEW_TASK
bootMainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(bootMainIntent);
}
}
}
在AndroidMainfest.xml中注册该广播接收类
<!--开机自启动-->
<receiver android:name=".BootBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.LAUNCHER"></category>
</intent-filter>
</receiver>
编译,调试
注意事项
请注意BootBroadcastReceiver的命名空间,要保证AndroidMainfest.xml中receiver可以找的到我们创建的BootBroadcastReceiver类。
应用程序必须在Android中启动一次,下次才可以开机启动。