说明
本文实现一个Android开启时启动一个app或者service,在Android系统启动之后,系统会发布一个RECEIVE_BOOT_COMPLETED的广播信号,我们只要接受这个广播信号并进行处理就可以实现开机启动的效果。因实现原理比较简单,所以这就不对技术层面的东西进行细讲。
权限
首先在你的AndroidManifest.xml添加一个开机启动的权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
接收
我们先创建一个BroadcastReceiver来接收系统的广布,我这里的名字为BroadcastReceiverImpl,具体的代码如下:
/**
* 系统广播接收者
*/
class BroadcastReceiverImpl: BroadcastReceiver(), KIExtensionContext {
/**
* 接收广播入口函数
*/
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
/*
* 开机启动的信号标识
*/
"android.intent.action.BOOT_COMPLETED" -> {
/*
* 启动应用本身,launchAppByPackage实现代码:http://t.cn/EZ29zEV
*/
context.launchAppByPackage(BuildConfig.APPLICATION_ID)
/*
* 启动一个Service
*/
context.startService(Intent(context, ServiceHttpd::class.java))
}
/**
* 其他的信号
*/
else -> { }
}
}
}
配置
有了上面的代码还不行,还得添加对应的声明才可以。
<!-- 应用广播的接收者 -->
<receiver android:name="com.sollyu.appenv.api.broadcast.BroadcastReceiverImpl" >
<intent-filter>
<!-- 接收开机启动广播 -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
其他
因为开机启动也算一个比较敏感的权限,所以国内的系统都差不多吧这个权限压的死死的,就比如MIUI、魅族、OPPO、VIVO,如果你不在他们的安全中心运行开机启动,你APP是收不到信息的。
如果收不到BOOT_COMPLETED的消息,你可以像办法把软件设置成系统应用就可以了。😋