Android原生的registerReceiver与LocalBroadcastManager的区别,以及为什么会存在这样的区别?

  • Andord原生的registerReceiver方式是可以跨进程使用的,因为它使用的是Binder机制,它的registerBroadcast,unregisterReceiver和sendBroadcast都是在ActivityManagerService中实现的,所以它能支持跨进程广播。

  • LocalBroadcastManager方式实际上是通过单例LocalBroadcastManager对象中的几个变量存储Broadcast,IntentFilter

private final HashMap<BroadcastReceiver, ArrayList<IntentFilter>> mReceivers
            = new HashMap<BroadcastReceiver, ArrayList<IntentFilter>>();
private final HashMap<String, ArrayList<ReceiverRecord>> mActions
            = new HashMap<String, ArrayList<ReceiverRecord>>();

private final ArrayList<BroadcastRecord> mPendingBroadcasts
            = new ArrayList<BroadcastRecord>();

一旦跨进程,这个LocalBroadcastManager就不是同一个对象了。
当sendBroadcast时,是使用Handler发送Message的方式,实现事件回调的

if (!mHandler.hasMessages(MSG_EXEC_PENDING_BROADCASTS)) {
    mHandler.sendEmptyMessage(MSG_EXEC_PENDING_BROADCASTS);
}

Handler是在构造方法中创建的

 private LocalBroadcastManager(Context context) {
 mAppContext = context;
 mHandler = new Handler(context.getMainLooper()) {

      @Override
      public void handleMessage(Message msg) {
           switch (msg.what) {
           case MSG_EXEC_PENDING_BROADCASTS:
                executePendingBroadcasts();
                break;
                default:
                super.handleMessage(msg);
           }
     }
   };
}
 private void executePendingBroadcasts() {
        while (true) {
            BroadcastRecord[] brs = null;
            synchronized (mReceivers) {
                final int N = mPendingBroadcasts.size();
                if (N <= 0) {
                    return;
                }
                brs = new BroadcastRecord[N];
                mPendingBroadcasts.toArray(brs);
                mPendingBroadcasts.clear();
            }
            for (int i=0; i<brs.length; i++) {
                BroadcastRecord br = brs[i];
                for (int j=0; j<br.receivers.size(); j++) {
                    br.receivers.get(j).receiver.onReceive(mAppContext, br.intent);
                }
            }
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容