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并看到我们的程序主界面被拉起了。

相关推荐
煤泥做不到的!1 小时前
挑战一个月基本掌握C++(第十一天)进阶文件,异常处理,动态内存
开发语言·c++
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
bryant_meng2 小时前
【python】OpenCV—Image Moments
开发语言·python·opencv·moments·图片矩
若亦_Royi3 小时前
C++ 的大括号的用法合集
开发语言·c++
资源补给站4 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
m0_748247554 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.944 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
FF在路上4 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
众拾达人5 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言