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/andrindex 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,大功告成。


更多相关文章

  1. Android监听屏幕锁屏
  2. Android状态check、focused、pressed、selected小结
  3. Android与IOS异同点对比(1)------ 显示
  4. 处女男学Android(十五)---Android(安卓)广播机制之Broadcast Recei
  5. android:shape的使用 (android用xml文件生成图像控件)
  6. Android-statuabar电池管理
  7. 安卓隐藏标题栏状态栏 ,实现全屏效果
  8. Android中的Junit单元测试
  9. Android屏幕尺寸、标题栏高度、状态栏高度、当前View尺寸

随机推荐

  1. ContentPRovider示例
  2. 自定义数据适配器
  3. Android(安卓)Studio 添加Assets目录
  4. android fragment addToBackStack bug
  5. 关于android API中的android.app.Pending
  6. android 按钮点击事件
  7. android vlc compile error fix
  8. Activity嵌套ViewPager+Fragment
  9. android桌面图标读取和存储
  10. C ++头文件的十大错误,如何解决这些问题