全志A40I Android7.1系统开机自启动,也适用于其他Android系统。Android系统的自启动不同于Linux系统,linux直接在内核init.rc中修改,应用层不用修改,而Android要在应用层中修改
1.在Android系统内核中首先应确保系统能够发送广播信号
在Android内核中frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 查看
skipPackages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
} else {
- mBackgroundManagerService.resolverReceiver(intent, receivers);
+ if(!Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())){
+ mBackgroundManagerService.resolverReceiver(intent, receivers);
+ }
}
if (skipPackages != null && (skipPackages.length > 0)) {
for (String skipPackage : skipPackages) {
2.在AndroidManifest.xml中增加相关启动权限
<?xml version="1.0" encoding="utf-8"?>
<manifest
.............
<!-- 开机启动权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
.........
<application
.........
<receiver
android:name=".SysBootReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter android:priority="1000">
<!--.接收启动完成的广播-->
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
</application>
</manifest>
3.创建一个广播接收类
public class SysBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
LogV("action=" + action);
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
// 服务自启动
Intent intent = new Intent(context, MainActivity.class); // 要启动的Activity
intent .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
}
若还是无法自启动,请检查:
a、应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播
b、BOOT_COMPLETED对应的action和uses-permission没有一起添加
c、系统开启了Fast Boot模式,该模式下系统启动后不会发送BOOT_COMPLETED广播
d、应用程序安装后重来没有启动过,该情况下应用程序接收不到任何广播,包括BOOT_COMPLETED、ACTION_PACKAGE_ADDED、CONNECTIVITY_ACTION等等,请检查系统广播是否启动过相关限制