Android 让程序随系统自动启动并允许后台运行(白名单)

最近制作一个管理程序,需要在开机时候启动,并持续运行。这里简单记录下如何制作。

自启动原理

系统在启动的时候会广播一个ACTION_BOOT_COMPLETED,带有接收的程序可以收到,所以我们在接收到以后把程序运行起来。

清单文件设置

所以我们首先在清单文件AndroidManifest.xml的application节点中添加(receiver ),和RECEIVE_BOOT_COMPLETED权限。

如下内容:

java 复制代码
<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类,如下:

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权限。

java 复制代码
<!-- 白名单 -->
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />

脚本

脚本中我们在onCreate函数中添加:

首先判断是否已经在白名单了,如果不在我们进行添加,这样在打开应用的时候会提示是否允许添加到白名单。

kotlin 复制代码
	Log.i("test","是否白名单"+isIgnoringBatteryOptimizations())
    if(!isIgnoringBatteryOptimizations())
    {
        requestIgnoreBatteryOptimizations()
    }
	

函数:

kotlin 复制代码
//查询白名单
    @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并看到我们的程序主界面被拉起了。

相关推荐
泽虞4 分钟前
《Qt应用开发》笔记
linux·开发语言·c++·笔记·qt
专职6 分钟前
pytest详细教程
开发语言·python·pytest
专职13 分钟前
pytest+requests+allure生成接口自动化测试报告
开发语言·python·pytest
风起云涌~17 分钟前
【Java】浅谈ServiceLoader
java·开发语言
那我掉的头发算什么26 分钟前
【数据结构】优先级队列(堆)
java·开发语言·数据结构·链表·idea
用户20187928316738 分钟前
类的回收大冒险:一场Android王国的"断舍离"故事
android
用户20187928316740 分钟前
Android Class 回收原理及代码演示
android
前端 贾公子1 小时前
《Vuejs设计与实现》第 18 章(同构渲染)(上)
android·flutter
LiuYaoheng1 小时前
【Android】Android 的三种动画(帧动画、View 动画、属性动画)
android·java
苏苏码不动了1 小时前
Android Studio 虚拟机启动失败/没反应,排查原因。提供一种排查方式。
android·ide·android studio