学习之鸿蒙&Android学习

Android App 开机自启动

2021-08-03  本文已影响0人  cain07

<article class="_2rhmJa">

Android 设备开机自启动的可以用广播实现,因为 Android 设备开机时会发送一条开机广播 "android.intent.action.BOOT_COMPLETED"。接收后实现启动就完成了。

少啰嗦,先看核心代码

public class BootBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
            Intent intent = new Intent(context,MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
        }
    }
}

接下来是准备工作

  1. 先添加权限
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

  2. 注册常驻广播

<receiver android:name=".BootBroadcastReceiver"
           android:enabled="true"
           android:exported="true"
           android:permission="android.permission.RECEIVE_BOOT_COMPLETED"
           >
           <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED" />

               <category android:name="android.intent.category.DEFAULT" />
           </intent-filter>
</receiver>

可能出现的问题

然而 上面的配置 并不能启动APP

重启手机,测试app有没有自动启动。如果有,那么恭喜你。如果没有,请往下看。

如果按照上面的全部步骤后操作后,重启没有自动启动程序,怎么办呢?是怎么回事呢?

*那么首先请检查一下你的手机是不是安装了360等安全助手之类的软件,如果有,请在软件的自启动软件管理中将app设置为允许
*我的手机没有安装这些软件,但是手机中自带了安全助手,有的手机系统设置里面自带了自启动软件管理的功能 ,所以在这里将我们的app设置为允许开机启动),重启手机,测试是否成功。

然而并没有成功

2、自启动失败的原因

接收不到BOOT_COMPLETED广播可能的原因
(1)、BOOT_COMPLETED对应的action和uses-permission没有一起添加
(2)、应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的
(3)、系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播
(4)、应用程序安装后重来没有启动过,这种情况下应用程序接收不到任何广播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等。
Android3.1之后,系统为了加强了安全性控制,应用程序安装后或是(设置)应用管理中被强制关闭后处于stopped状态,在这种状态下接收不到任何广播,除非广播带有FLAG_INCLUDE_STOPPED_PACKAGES标志,而默认所有系统广播都是FLAG_EXCLUDE_STOPPED_PACKAGES的,所以就没法通过系统广播自启动了。所以Android3.1之后
(1)、应用程序无法在安装后自己启动
(2)、没有ui的程序必须通过其他应用激活才能启动,如它的Activity、Service、Content Provider被其他应用调用。
存在一种例外,就是应用程序被adb push you.apk /system/app/下是会自动启动的,不处于stopped状态。

并不太懂 我的APP启动后 已经收到广播

 /**
     * 启动 pjj app
     *
     * @param context
     */
    private void startApp(Context context) {
        Log.e("TAG", "onReceive: 重启广播");
        /*Intent i = new Intent();
        ComponentName com = new ComponentName("com.tlw.xsp", "com.tlw.xsp.view.activity.InactiveActivity");
        i.setComponent(com);
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);*/
        FileUtils.saveStringFile(PjjApplication.App_Path + "restart.txt", "重启");
        new Handler().postDelayed(() -> {
            PackageManager packageManager = context.getPackageManager();
            Intent intent = packageManager.getLaunchIntentForPackage("com.pjj.xsp");
            context.startActivity(intent);
        }, 2000);

        /*Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.pjj.xsp");
        PendingIntent restartIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
        AlarmManager mgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, restartIntent); // 1秒钟后重启应用*/
        //System.exit(0);
    }

还是不能启动 越高版本的系统 可能处于 安全考虑 开机自启动 限制 越来越多 但是实现上 可能 有别的办法 绕过 这种安全方式 ?

第一种方式 我再模拟器上 测试 可以 android 9.0版本

<activity android:name=".MainActivity">
<intent-filter>
 <action android:name="android.intent.action.MAIN" />
 <category android:name="android.intent.category.LAUNCHER"/>
 <category android:name="android.intent.category.HOME" />
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="android.intent.category.MONKEY"/>
</intent-filter>
</activity>

桌面设置也会把你的app当成一个桌面主题,还有一个选项是系统桌面,你需要设置成自己的app

如果找不到桌面设置选项,可以从手机设置–应用程序-查看所有应用程序(包括系统的应用程序),找到桌面程序之类的字眼的应用,清楚其默认设置。

上一篇下一篇

猜你喜欢

热点阅读