Android 有自己的开机广播:

/**

* Broadcast Action: This is broadcast once, after the system has finished

* booting. It can be used to perform application-specific initialization,

* such as installing alarms. You must hold the

* {@link android.Manifest.permission#RECEIVE_BOOT_COMPLETED} permission

* in order to receive this broadcast.

*

*

This is a protected intent that can only be sent

* by the system.

*/

@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)

public static final String ACTION_BOOT_COMPLETED = "android.intent.action.BOOT_COMPLETED";

但是在接触的一台设备上,这个广播在进入Launcher之后45秒才收到。明显慢了很多。

通过节点去控制设备的开光状态,节点在关机重启时会被重置为默认状态,这就意味着45s之后才能给节点设为用户上次的设置的值。在这之前的一些数据会丢失或错误计算。

所以只能添加一个自定义的开机广播,当系统启动完成即刻发出。但是要注意的是,此时并非真正意义上的“BOOT_COMPLETED”,也就是说系统的一些状态还没有初始化成功,比如IMEI号,此时去获取的话返回的是null,但是启动服务去执行自己的操作还是可以的。

添加方法:

diff --git a/kitkat/frameworks/base/services/java/com/android/server/SystemServer.java b/kitkat/frameworks/base/services/java/com/andr

index b61b9f3..eac817b 100644

--- a/kitkat/frameworks/base/services/java/com/android/server/SystemServer.java

+++ b/kitkat/frameworks/base/services/java/com/android/server/SystemServer.java

@@ -983,6 +983,7 @@ class ServerThread {

if (!headless) {

startSystemUi(contextF);

//startSimStateChangeService(contextF);

+ sendCustomBootCompleted(contextF);

}

try {

if (mountServiceF != null) mountServiceF.systemReady();

@@ -1146,6 +1147,18 @@ class ServerThread {

Slog.d("SimStateChange", "Starting service: " + intent);

context.startServiceAsUser(intent, UserHandle.OWNER);

}

+

+ static final void sendCustomBootCompleted(Context context){

+ try {

+ Intent intent = new Intent();

+ intent.setAction("test.intent.action.BOOT_COMPLETED");

+ context.sendBroadcast(intent);

+ System.out.println("send custom broadcast");

+ } catch (Exception e) {

+ e.printStackTrace();

+ System.out.println("Unable to send custom broadcast");

+ }

+ }

} Okay,大功告成。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐