08-21 18:17:31.569 1617 1617 V ActivityManager: Broadcast: Intent { act=android.intent.action.SYSTEM_POWER_BATTERY_STATUS flg=0x4000010 (has extras) } ordered=false userid=-1
08-21 18:17:31.569 1617 1617 V ActivityManager: Enqueing broadcast: android.intent.action.SYSTEM_POWER_BATTERY_STATUS replacePending=false
08-21 18:17:31.569 1617 1617 I ActivityManager: Broadcast intent Intent { act=android.intent.action.SYSTEM_POWER_BATTERY_STATUS flg=0x4000010 (has extras) } on background queue
08-21 18:17:31.569 1617 1617 V ActivityManager: Enqueueing parallel broadcast BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.569 1617 1617 V BroadcastQueue: Schedule broadcasts [background]: current=false
08-21 18:17:31.569 1617 1617 W ActivityManager: (receivers != null)=false
08-21 18:17:31.569 1617 1633 V BroadcastQueue: Received BROADCAST_INTENT_MSG
08-21 18:17:31.569 1617 1617 W ActivityManager: BROADCAST_SUCCESS
08-21 18:17:31.569 1617 1633 V BroadcastQueue: processNextBroadcast [background]: 1 broadcasts, 0 ordered broadcasts
08-21 18:17:31.569 1617 1633 V BroadcastQueue: Processing parallel broadcast [background] BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.569 1617 1633 V BroadcastQueue: Delivering non-ordered on [background] to registered BroadcastFilter{4237a898 u0 ReceiverList{4237b100 1826 com.android.systemui/10006/u0 remote:424690b0}}: BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.569 1617 1633 I BroadcastQueue: Delivering to BroadcastFilter{4237a898 u0 ReceiverList{4237b100 1826 com.android.systemui/10006/u0 remote:424690b0}} (seq=-1): BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.569 1617 1633 V BroadcastQueue: Delivering non-ordered on [background] to registered BroadcastFilter{42506318 u0 ReceiverList{4259f7a0 1904 com.android.imagebrowser/10017/u0 remote:42210290}}: BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.569 1617 1633 I BroadcastQueue: Delivering to BroadcastFilter{42506318 u0 ReceiverList{4259f7a0 1904 com.android.imagebrowser/10017/u0 remote:42210290}} (seq=-1): BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
08-21 18:17:31.574 1826 1826 D AlarmUIController: System temperature is 44
08-21 18:17:31.574 1826 1826 D AlarmUIController: Light temperature is -1
08-21 18:17:31.574 1826 1826 D AlarmUIController: Color Wheel temperature is -1
08-21 18:17:31.574 1826 1826 D AlarmUIController: showAlarmUI
08-21 18:17:31.574 1904 1904 I StatusBarView: kangwx onReceive ACTION_BATTERY battery: 0 acdc:0
08-21 18:17:31.574 1904 1904 I kangwz : device:android_M64
08-21 18:17:31.574 1617 1633 V BroadcastQueue: Done with parallel broadcast [background] BroadcastRecord{425f9d68 u-1 android.intent.action.SYSTEM_POWER_BATTERY_STATUS}
两个广播队列:
BroadcastQueue mFgBroadcastQueue; //前台广播队列
BroadcastQueue mBgBroadcastQueue; //后台广播队列
ActivityManagerService
一、AMS发出广播:
private final int broadcastIntentLocked(ProcessRecord callerApp,
String callerPackage, Intent intent, String resolvedType,
IIntentReceiver resultTo, int resultCode, String resultData,
Bundle map, String requiredPermission, int appOp,
boolean ordered, boolean sticky, int callingPid, int callingUid,
int userId);
//获取注册的广播接收者
//注册广播接收者时:registerReceiver,就是把把广播接收器receiver和filter关联起来,并保存到mReceiverResolver.这样,广播接收器注册到这边就可以了。mReceiverResolver.addFilter(bf);
registeredReceivers = mReceiverResolver.queryIntent(intent,
resolvedType, false, userId);
二、获取前台/后台广播队列:
BroadcastQueue broadcastQueueForIntent(Intent intent);
BroadcastQueue
三、入广播队列:
enqueueParallelBroadcastLocked
四、异步轮循处理广播:
scheduleBroadcastsLocked
mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this));
processNextBroadcast
五、分发到具体的广播接收者
deliverToRegisteredReceiverLocked//Delivering to BroadcastFilter
performReceiveLocked
六、广播接收者处理广播:
app.thread.scheduleRegisteredReceiver
receiver.performReceive
receiver.onReceive(mContext, intent);
broadcastIntentLocked
queue.enqueueParallelBroadcastLocked(r);//无序广播
queue.scheduleBroadcastsLocked();
queue.enqueueOrderedBroadcastLocked(r);//有序广播
queue.scheduleBroadcastsLocked();
BroadcastQueue
scheduleBroadcastsLocked//分发广播
processNextBroadcast//处理广播
deliverToRegisteredReceiverLocked//Delivering to BroadcastFilter//分发到具体的广播接收者
performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver,
new Intent(r.intent), r.resultCode, r.resultData,
r.resultExtras, r.ordered, r.initialSticky, r.userId);
private static void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver,
Intent intent, int resultCode, String data, Bundle extras,
boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
// Send the intent to the receiver asynchronously using one-way binder calls.
if (app != null && app.thread != null) {
// If we have an app thread, do the call through that so it is
// correctly ordered with other one-way calls.
app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
data, extras, ordered, sticky, sendingUser, app.repProcState);
} else {
receiver.performReceive(intent, resultCode, data, extras, ordered,
sticky, sendingUser);
}
}
它通过InnerReceiver来实现广播的接收。
然后InnerReceiver的performReceive方法会调用LoadedApk.ReceiverDispatcher的PerformReceive方法。
最终会回调到receiver.onReceive()这个方法。
ReceiverDispatcher.Args
run
receiver.onReceive(mContext, intent);