最近制作一个管理程序,需要在开机时候启动,并持续运行。这里简单记录下如何制作。
自启动原理
系统在启动的时候会广播一个ACTION_BOOT_COMPLETED,带有接收的程序可以收到,所以我们在接收到以后把程序运行起来。
清单文件设置
所以我们首先在清单文件AndroidManifest.xml的application节点中添加(receiver ),和RECEIVE_BOOT_COMPLETED权限。
如下内容:
<application 。。。。。。。。.
<!-- 接收来自系统启动的消息 -->
<receiver android:name=".BootBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
<!-- 需要接收系统启动通知的权限 -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
接收程序
清单文件中的BootBroadcastReceiver就是接收,我们再创建一个Java类,如下:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootBroadcastReceiver extends BroadcastReceiver {
static final String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent)
{
Log.i("test - 广播启动","启动了,开启游戏管理器.");
if (intent.getAction().equals(ACTION)){
String apk_name = context.getPackageName();
Intent it = context.getPackageManager().getLaunchIntentForPackage(apk_name);
if (it != null) {
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
}
}
}
}
这样启动部分就做好了。
白名单
白名单就是把自己加入到系统白名单,不会在电池管理里去关闭掉进程。
清单文件
需要添加一个REQUEST_IGNORE_BATTERY_OPTIMIZATIONS权限。
<!-- 白名单 -->
<uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
脚本
脚本中我们在onCreate函数中添加:
首先判断是否已经在白名单了,如果不在我们进行添加,这样在打开应用的时候会提示是否允许添加到白名单。
Log.i("test","是否白名单"+isIgnoringBatteryOptimizations())
if(!isIgnoringBatteryOptimizations())
{
requestIgnoreBatteryOptimizations()
}
函数:
//查询白名单
@RequiresApi(api = Build.VERSION_CODES.M)
private fun isIgnoringBatteryOptimizations(): Boolean {
var isIgnoring = false
val powerManager = getSystemService(POWER_SERVICE) as PowerManager
if (powerManager != null) {
isIgnoring = powerManager.isIgnoringBatteryOptimizations(packageName)
}
return isIgnoring
}
//添加到白名单
@RequiresApi(api = Build.VERSION_CODES.M)
fun requestIgnoreBatteryOptimizations() {
try {
val intent: Intent = Intent(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS)
intent.setData(Uri.parse("package:$packageName"))
startActivity(intent)
} catch (e: java.lang.Exception) {
e.printStackTrace()
}
}
第一次运行可以看到这个允许的界面
我的主界面是kotilin的,发觉还是Java语法顺手,就这样吧。
测试
最后我们编译运行后再设备重启,我们可以看到Log并看到我们的程序主界面被拉起了。