Android 应用开机自启的两个方案

先说说两个案例

  1. 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 的应用可以接收到广播
  1. 通过使用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开机自启的两个方案了。

    原文作者:isletn
    原文地址: https://www.jianshu.com/p/11213eb4bdb2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞