问题场景
最近开发一个展示类应用项目,展示设备为若干个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为应用程序启动主界面
到这里解决问题的思路就完整了,我们监听ACTION_BOOT_COMPLETED广播,并在监听逻辑中启动应用的对应的Main Activity。
方案:
-
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; //H5+SDK 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中启动一次,下次才可以开机启动。
原文地址:https://ask.dcloud.net.cn/article/id-689__page-2
下面是我写的代码。使用H5+SDK离线打包,在Android一体机中实验成功。
AndroidMainfest.xml完整配置
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application android:name="io.dcloud.application.DCloudApplication" android:allowClearUserData="true" android:exported="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true"> <activity android:name="io.dcloud.PandoraEntry" android:configChanges="orientation|keyboardHidden|keyboard|navigation" android:label="@string/app_name" android:launchMode="singleTask" android:hardwareAccelerated="true" android:theme="@style/TranslucentTheme" android:screenOrientation="user" android:windowSoftInputMode="adjustResize" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--开机自启动-->
<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>
</application>