Android4.4 framework分析——廣播的註冊(BroadcastReceiver)和發送(sendbroadcast)過程分析
在Android應用程式架構中,Activity和Service類都繼承了ContextWrapper類,因此,我們可以在Activity或者Service的子類中調用registerReceiver函數來註冊廣播接收器。
是在activity中註冊廣播的過程:
step1~step3,就是一般的調用過程。
step4,registerReceiverInternal()方法如下:
private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, IntentFilter filter, String broadcastPermission, Handler scheduler, Context context) { IIntentReceiver rd = null; if (receiver != null) { if (mPackageInfo != null && context != null) { if (scheduler == null) { scheduler = mMainThread.getHandler(); } rd = mPackageInfo.getReceiverDispatcher( receiver, context, scheduler, mMainThread.getInstrumentation(), true); } else { if (scheduler == null) { scheduler = mMainThread.getHandler(); } rd = new LoadedApk.ReceiverDispatcher( receiver, context, scheduler, null, true).getIIntentReceiver(); } } try { return ActivityManagerNative.getDefault().registerReceiver( mMainThread.getApplicationThread(), mBasePackageName, rd, filter, broadcastPermission, userId); } catch (RemoteException e) { return null; } }
scheduler傳下的是null,scheduler = mMainThread.getHandler();將獲得H的對象mH,用於後續broadcast的發送。
step6,先從已有的註冊列表mReceivers中尋找是否由相同的ReceiverDispatcher,若之前沒有註冊過,則new一個ReceiverDispatcher,並記錄在mReceivers中,ReceiverDispatcher建立過程中,同時產生一個InnerReceiver,InnerReceiver用於接收處理sendBroadcast發過來的廣播。
step9~step11,通過binder訪問ActivityManagerService的registerReceiver,將廣播接收器receiver儲存起來。
是廣播發送(sendBroadcast)的過程:
右鍵複製圖片地址,在瀏覽器中開啟即可查看大圖。
未完待續,有不對的地方,請指正。