Android - 开机自启动功能实现

转载请注明出处:https://blog.csdn.net/mythmayor/article/details/80454856

前言:开机自启动的功能在日常开发中可能比较少见,但是还是有一部分行业需要这样的需求。之前同事研究过一段时间,但结果却不理想。这很大程度上是和安卓手机系统相关的,众所周知,安卓系统被各大厂商改的各不相同。网上我们可以找到很多这样的代码,但是用下来可能都失败了。我在这个功能上也学习了一下,记录一下自己的心得。

一、首先需要定义一个开机广播接收者BootBroadcastReceiver:

public class BootBroadcastReceiver extends BroadcastReceiver {
    static final String ACTION = "android.intent.action.BOOT_COMPLETED";

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "开机启动成功", Toast.LENGTH_LONG).show();
        Log.i("❤驭霖·骏泊☆Myth.Mayor❤", "BootBroadcastReceiver --- onReceive: " + intent.getAction());
        //开机后一般会停留在锁屏页面且短时间内没有进行解锁操作屏幕会进入休眠状态,此时就需要先唤醒屏幕和解锁屏幕
        //屏幕唤醒
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
                | PowerManager.SCREEN_DIM_WAKE_LOCK, "StartupReceiver");//最后的参数是LogCat里用的Tag
        wl.acquire();
        //屏幕解锁
        KeyguardManager km = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
        KeyguardManager.KeyguardLock kl = km.newKeyguardLock("StartupReceiver");//参数是LogCat里用的Tag
        kl.disableKeyguard();
        if (intent.getAction().equals(ACTION)) {
            //要启动的Activity
            Intent bootIntent = new Intent(context, MainActivity.class);
            bootIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(bootIntent);
        }
    }
}

需要说明一下,手机开机后如果没有任何操作可能就会锁屏并进入休眠状态,我在代码中加了屏幕唤醒的功能。

二、清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mythmayor.powerbootdemo">

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".BootBroadcastReceiver">
            <intent-filter>
                <!--注册开机广播地址-->
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

说明:我们在清单文件中添加了三个权限,”RECEIVE_BOOT_COMPLETED”是开机启动的权限,”WAKE_LOCK”和”DISABLE_KEYGUARD”是屏幕唤醒的权限。同时,我们声明了一下广播接收者,并添加了”action”和”category”。

三、核心代码已经介绍完毕。在使用这个功能的时候要主要两点:1.虽然我们已经声明了权限,但仍需要进入应用管理中查看是否真正开启了这些权限。没有的话手动再开一下。就像下图展示的这样,我在代码中声明了自启权限,但是在应用管理中依然是禁止的,这时就需要我们手动去改为允许 2.开机后可能会有些延迟才会接收到开机广播,因为系统要做一些初始化工作,但时间不会太长,稍作等待程序就会自启动了。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/mythmayor/article/details/80454856