分析廣播的註冊和隊列分發

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

    
 

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