<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                #### 9.4.1 廣播的注冊過程 廣播的注冊分為靜態注冊和動態注冊,其中靜態注冊的廣播在應用安裝時由系統自動完成注冊,具體來說是由PMS(PackageManagerService)來完成整個注冊過程的,除了廣播以外,其他三大組件也都是在應用安裝時由PMS解析并注冊的。這里只分析廣播的動態注冊的過程,動態注冊的過程是從ContextWrapper的registerReceiver方法開始的,和Activity以及Service一樣。ContextWrapper并沒有做實際的工作,而是將注冊過程直接交給了ContextImpl來完成,如下所示。 public Intent registerReceiver( BroadcastReceiver receiver, IntentFilter filter) { return mBase.registerReceiver(receiver, filter); } ContextImpl的registerReceiver方法調用了自己的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).getIIntent- Receiver(); } } try { return ActivityManagerNative.getDefault().registerReceiver( mMainThread.getApplicationThread(), mBasePackageName, rd, filter, broadcastPermission, userId); } catch (RemoteException e) { return null; } } 在上面的代碼中,系統首先從mPackageInfo獲取IIntentReceiver對象,然后再采用跨進程的方式向AMS發送廣播注冊的請求。之所以采用IIntentReceiver而不是直接采用BroadcastReceiver,這是因為上述注冊過程是一個進程間通信的過程,而BroadcastReceiver作為Android的一個組件是不能直接跨進程傳遞的,所以需要通過IIntentReceiver來中轉一下。毫無疑問,IIntentReceiver必須是一個Binder接口,它的具體實現是LoadedApk.Receiver-Dispatcher.InnerReceiver, ReceiverDispatcher的內部同時保存了BroadcastReceiver和InnerReceiver,這樣當接收到廣播時,ReceiverDispatcher可以很方便地調用BroadcastReceiver的onReceive方法,具體會在9.4.2節中說明。可以發現,BroadcastReceiver的這個過程和Service的實現原理類似,Service也有一個叫ServiceDispatcher的類,并且其內部類InnerConnection也是一個Binder接口,作用同樣也是為了進程間通信,這一點在9.3.2節中已經描述過了,這里不再重復說明。 關于ActivityManagerNative.getDefault(),這里就不用再做說明了,它就是AMS,在前面的章節中已經多次提到它。下面看一下ReceiverDispatcher的getIIntentReceiver的實現,如下所示。很顯然,getReceiverDispatcher方法重新創建了一個ReceiverDispatcher對象并將其保存的InnerReceiver對象作為返回值返回,其中InnerReceiver對象和BroadcastReceiver都是在ReceiverDispatcher的構造方法中被保存起來的。 public IIntentReceiver getReceiverDispatcher(BroadcastReceiver r, Context context, Handler handler, Instrumentation instrumentation, boolean registered) { synchronized (mReceivers) { LoadedApk.ReceiverDispatcher rd = null; ArrayMap<BroadcastReceiver, LoadedApk.ReceiverDispatcher> map = null; if (registered) { map = mReceivers.get(context); if (map ! = null) { rd = map.get(r); } } if (rd == null) { rd = new ReceiverDispatcher(r, context, handler, instrumentation, registered); if (registered) { if (map == null) { map = new ArrayMap<BroadcastReceiver, LoadedApk. ReceiverDispatcher>(); mReceivers.put(context, map); } map.put(r, rd); } } else { rd.validate(context, handler); } rd.mForgotten = false; return rd.getIIntentReceiver(); } } 由于注冊廣播的真正實現過程是在AMS中,因此我們需要看一下AMS的具體實現。AMS的registerReceiver方法看起來很長,其實關鍵點就只有下面一部分,最終會把遠程的InnerReceiver對象以及IntentFilter對象存儲起來,這樣整個廣播的注冊過程就完成了,代碼如下所示。 public Intent registerReceiver(IApplicationThread caller, String callerPackage, IIntentReceiver receiver, IntentFilter filter, String permission, int userId) { ... mRegisteredReceivers.put(receiver.asBinder(), rl); BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, permission, callingUid, userId); rl.add(bf); if (! bf.debugCheck()) { Slog.w(TAG, "==> For Dynamic broadast"); } mReceiverResolver.addFilter(bf); ... }
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看