做 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/upgrade
if (userId == UserHandle.USER_SYSTEM
&& !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {
int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);
MetricsLogger.histogram(mInjector.getContext(), "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() {
@Override
public 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
;