转载请注明出处: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”。