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

相关推荐
百锦再34 分钟前
Android Studio 中文字大小的单位详解
android·xml·java·ide·app·android studio
隐-梵38 分钟前
Android studio前沿开发--利用socket服务器连接AI实现前后端交互(全站首发思路)
android·服务器·人工智能·后端·websocket·android studio·交互
m0_zj1 小时前
41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5
开发语言·javascript·es6
海棠蚀omo1 小时前
C++笔记-list
开发语言·c++·笔记
烟雨柳成烟1 小时前
C++学习Day0:c++简介
开发语言·c++·qt·学习
鸿蒙布道师1 小时前
鸿蒙NEXT开发图片相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
奔跑吧 android1 小时前
【android telecom 框架分析 01】【基本介绍 2】【BluetoothPhoneService为何没有源码实现】
android·telecom·phone·btphone
懋学的前端攻城狮1 小时前
Android一些基础-08-一个简单的通知
android·android studio
V少年2 小时前
深入浅出安卓协程
android
V少年2 小时前
深入浅出安卓App的启动流程
android