Android 开机自启动service实践
2017-07-07 本文已影响0人
sy1121
Android 设备启动的时候,会发送android.intent.action.BOOT_COMPLETED的广播,监听这个广播来实现开机自启动。
开机自启动service 的实现步骤
1) 创建需要的service和 BroadcastReceiver
2) 在AndroidManifest.xml 注册service 和BroadcastReceiver
<service android:name=".MyService"
android:enabled="true"
android:exported="true" />
<receiver
android:name=".sheyi.proinfo.utils.BootReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="com.tencent.yishe.destroy" />//这个就是自定义的action
</intent-filter>
</receiver>
3)申明权限
```
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
4) 在BroadcastReceiver 启动服务
if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")){
Log.d("BootReceiver", "system boot completed");
Intent service = new Intent(context, MyService.class);
context.startService(service);
// 启动activity
/* Intent mainActivityIntent = new Intent(context, MainActivity.class); // 要启动的Activity
mainActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainActivityIntent); */
}
####坑
实践发现通过以上方式是现实的开机自启动服务在开机后并没有自动运行。原因是在Android3.1之后,系统为了加强了安全性控制,应用程序安装后或是(设置)应用管理中被强制关闭后处于stopped状态,在这种状态下接收不到任何广播。对于android3.1以后版本,如果要应用接收开机广播有两种方法:
a).将应用预置到/system/app/目录。
b).安装应用后先启动一次。
*自启动失败的原因
接收不到BOOT_COMPLETED广播可能的原因
(1)、BOOT_COMPLETED对应的action和uses-permission没有一起添加
(2)、应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的
(3)、系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播
(4)、应用程序安装后重来没有启动过,这种情况下应用程序接收不到任何广播,包括BOOT_COMPLETED
*