先说说两个案例
- Android3.1后,用户通过 设置->应用程序->xxx.APP->”强制停止” 杀掉APP时,APP此时处于停止状态(stopped),而这个 stoped 与 Activity 的 stop 是不同的。
原因是 Android 为所有发送广播的 intent 添加了 FLAG_EXCLUDE_STOPPED_PACKAGES 这一属性
FLAG_EXCLUDE_STOPPED_PACKAGES:已停止的APP不能收到广播。
这里引出另一个FLAG:
FLAG_INCLUDE_STOPPED_PACKAGES:能处理 intent 的应用可以接收到广播
- 通过使用APK安装的应用,没有启动过的话,收不到系统发出的广播。因为它也是处于停止状态的。
虽说停止状态的应用无法收到系统广播,但也有一个例外:安装在 /system/app 路径下的APP
所以,如果想要你的应用能收到广播,至少需要启动一次APP改变停止状态或者将应用 push 到 /system/app。
解决方案:
1.通过 push xxx.apk /system/app 将应用安装到系统目录(需要root权限)
若提示 $ adb push ./xxx /xxx/
failed to copy ‘./xxx’ to ‘/xxx/xxx’: Read-only file system
解决方法:
$ adb root
$ adb remount
remount succeeded
2.使用FLAG_INCLUDE_STOPPED_PACKAGES这个标识,通过另一个应用启动你的应用,从而达到改变stop状态的目的
首先,在你的APP中创建一个BroadcastReceiver的子类,并在 onReceiver() 方法中实现相关逻辑实现自启
public class RebootBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Intent intent0 = new Intent(context, YourMainActivity.class);
if (intent0 != null) {
startActivity(intent0);
}
}
}
然后,需要在你想要启动APP的 AndroidManifest.xml 中静态注册:
<receiver android:name=".RebootBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.example.startApp"/>
</intent-filter>
</receiver>
最后,广播发送者 APP 使用如下代码通知你想要启动的 APP
Intent intent = new Intent();
intent.setAction("com.example.startApp");
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
sendBroadcast(intent);
OK~
以上就是Android开机自启的两个方案了。