在开发中,有时候会开机自动启动我们的应用的需求,之前的普遍做法是有接收开机广播,在广播接收者中启动服务执行任务。
code
manifest
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver
android:name=".interview.BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
public class BootCompleteReceiver extends BroadcastReceiver {
public BootCompleteReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i("renxl","自动启动成功");
}
}
但是随着国内厂商对 ROM 的定制对应用自启动加了黑白名单,例如华为、魅族、小米等厂商,在 Android 6.0 之前就提供了开机自启动黑白名单的功能,Android 6.0 开始系统也做了自启动功能的限制,主要是为了限制应用的自启动以减少开机时间以及优化电池的使用。
在自启动管理如果将我们的应用的权限关闭之后,值不能收到系统的开机广播,也就无法做到自启动功能了
解决方法是有一些的,下面根据从网上了解到的信息做几方面的总结
一、与厂商合作
在厂商的 ROM 包中默认将自己的 APP 加入白名单,但是这个需要自己 APP 强大的影响力
二、使用辅助功能 AccessibilityService
在 APP 中加入辅助功能,在 APP 中引导用户在系统的设置中打开该应用辅助功能,可以在辅助功能中不做任何的处理。由于辅助功能是系统级别的,所以注册了辅助功能的应用在在启动时也会被激活,这样接收开机广播的接收者也就可以正常接收到开机广播,从而实现功能。但是这个方法有个弊端,就是需要引导用户主动打开辅助功能,如果用户关闭辅助功能则该方法不能正常工作。
三、引导用户
在应用中提示用户主动在开机启动白名单中加入自己的APP,也可顺利接收开机广播完成功能,这也是我最支持的一种方式,只有自己的应用做的好,让用户离不开,持续为用户提供服务,这时才需要开机启动等需求