<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);
}
}
}
接下来是准备工作
先添加权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
注册常驻广播
<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>
可能出现的问题
安装在 SD 卡的应用自启动无效,安装在手机内存就好了。也可在 manifest 里面添加
android:installLocation="internalOnly
忘记加权限了,哈哈这种低级错误有时真的会遇到
需要 App 运行一次后才能实现开机自启
安装app到手机上,然后启动一次程序(据说安卓4.0以后,必须先启动一次程序才能接收到开机完成的广播,目的是防止恶意程序)
然而 上面的配置 并不能启动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
如果找不到桌面设置选项,可以从手机设置–应用程序-查看所有应用程序(包括系统的应用程序),找到桌面程序之类的字眼的应用,清楚其默认设置。