做 android 开发都知道有开机广播这回事,具体从哪里发出的呢?
追溯下源码,在 AN 9.0 frameworks/ 目录下搜索 ACTION_BOOT_COMPLETED
得知,
在 frameworks/base/services/core/java/com/android/server/am/UserController.java
文件里,
具体方法是 finishUserUnlockedCompleted
。
private void finishUserUnlockedCompleted(UserState uss) {synchronized (mLock) {// 省略其他Slog.i(TAG, "Sending BOOT_COMPLETE user #" + userId);// Do not report secondary users, runtime restarts or first boot/upgradeif (userId == UserHandle.USER_SYSTEM&& !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);MetricsLogger.Context(), "framework_boot_completed",uptimeSeconds);}final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT| Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);mInjector.broadcastIntentLocked(bootIntent, null, new IIntentReceiver.Stub() {@Overridepublic void performReceive(Intent intent, int resultCode, String data,Bundle extras, boolean ordered, boolean sticky, int sendingUser)throws RemoteException {Slog.i(UserController.TAG, "Finished processing BOOT_COMPLETED for u" + userId);}}, 0, null, null,new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED },AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);}
}
指定了 flag 为 Intent.FLAG_RECEIVER_NO_ABORT
,无法被截断;
需要声明权限 android.Manifest.permission.RECEIVE_BOOT_COMPLETED
;
本文发布于:2024-02-03 02:53:54,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170690003148177.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |