分析广播的注册和队列分发

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);
        

    
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章