本文共 10214 字,大约阅读时间需要 34 分钟。
// 全局广播 // 发送 val intent = Intent() intent.action=ActionConstant.ACTION_ONE intent.putExtra("EXTRA", "全局广播") sendBroadcast(intent) // 接收广播 private fun register() { val intentFilter = IntentFilter() intentFilter.addAction(ActionConstant.ACTION_ONE) registerReceiver(InnerBroadcastReceiver(), intentFilter) } // 本地广播 // 发送 val intent = Intent() intent.action=ActionConstant.ACTION_TWO intent.putExtra("EXTRA", "本地广播") val manager=LocalBroadcastManager.getInstance(this) manager.sendBroadcast(intent) // 接收 val localBroadcastManager = LocalBroadcastManager.getInstance(this) val intentFilter = IntentFilter() intentFilter.addAction(ActionConstant.ACTION_TWO) localBroadcastManager.registerReceiver(InnerBroadcastReceiver(), intentFilter) inner class InnerBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { when (intent?.action) { ActionConstant.ACTION_ONE -> { val str = intent?.getStringExtra("EXTRA") Log.e("peter", "接收到全局广播-> $str") mText?.text = str } } } }
(1)broadcastReceiver的响应时间为10s,超过10s无响应,将不会再次收到该广播
(2)onReceiver方法中不允许显示popUpWindow
LocalBroadcastManager是一个单例类
@NonNull public static LocalBroadcastManager getInstance(@NonNull Context context) { Object var1 = mLock; // 添加同步锁 synchronized(mLock) { if (mInstance == null) { mInstance = new LocalBroadcastManager(context.getApplicationContext()); } return mInstance; } }
private LocalBroadcastManager(Context context) { this.mAppContext = context; // 获取主线程的looper对象创建handler this.mHandler = new Handler(context.getMainLooper()) { public void handleMessage(Message msg) { switch(msg.what) { // 根据what值处理消息 case 1: LocalBroadcastManager.this.executePendingBroadcasts(); break; default: super.handleMessage(msg); } } }; }
public void registerReceiver(@NonNull BroadcastReceiver receiver, @NonNull IntentFilter filter) { HashMap var3 = this.mReceivers; // 线程安全 synchronized(this.mReceivers) { LocalBroadcastManager.ReceiverRecord entry = new LocalBroadcastManager.ReceiverRecord(filter, receiver); ArrayListfilters = (ArrayList)this.mReceivers.get(receiver); if (filters == null) { filters = new ArrayList(1); this.mReceivers.put(receiver, filters); } filters.add(entry); for(int i = 0; i < filter.countActions(); ++i) { String action = filter.getAction(i); // 遍历action ArrayList entries = (ArrayList)this.mActions.get(action); if (entries == null) { entries = new ArrayList(1); // 存储action this.mActions.put(action, entries); } // 添加到arrayList中 entries.add(entry); } } }
public boolean sendBroadcast(@NonNull Intent intent) { HashMap var2 = this.mReceivers; synchronized(this.mReceivers) { String action = intent.getAction(); String type = intent.resolveTypeIfNeeded(this.mAppContext.getContentResolver()); Uri data = intent.getData(); String scheme = intent.getScheme(); Setcategories = intent.getCategories(); boolean debug = (intent.getFlags() & 8) != 0; if (debug) { Log.v("LocalBroadcastManager", "Resolving type " + type + " scheme " + scheme + " of intent " + intent); } ArrayList entries = (ArrayList)this.mActions.get(intent.getAction()); if (entries != null) { if (debug) { Log.v("LocalBroadcastManager", "Action list: " + entries); } ArrayList receivers = null; int i; for(i = 0; i < entries.size(); ++i) { LocalBroadcastManager.ReceiverRecord receiver = (LocalBroadcastManager.ReceiverRecord)entries.get(i); if (debug) { Log.v("LocalBroadcastManager", "Matching against filter " + receiver.filter); } if (receiver.broadcasting) { if (debug) { Log.v("LocalBroadcastManager", " Filter's target already added"); } } else { // 过滤合适的receiver int match = receiver.filter.match(action, type, scheme, data, categories, "LocalBroadcastManager"); if (match >= 0) { if (debug) { Log.v("LocalBroadcastManager", " Filter matched! match=0x" + Integer.toHexString(match)); } if (receivers == null) { receivers = new ArrayList(); } // 将符合条件的receiver添加到arraylist中 receivers.add(receiver); receiver.broadcasting = true; } else if (debug) { String reason; switch(match) { case -4: reason = "category"; break; case -3: reason = "action"; break; case -2: reason = "data"; break; case -1: reason = "type"; break; default: reason = "unknown reason"; } Log.v("LocalBroadcastManager", " Filter did not match: " + reason); } } } if (receivers != null) { for(i = 0; i < receivers.size(); ++i) { ((LocalBroadcastManager.ReceiverRecord)receivers.get(i)).broadcasting = false; } // 将本地广播添加到mPendingBroadcasts集合中 this.mPendingBroadcasts.add(new LocalBroadcastManager.BroadcastRecord(intent, receivers)); if (!this.mHandler.hasMessages(1)) { // 通过handler发送消息 this.mHandler.sendEmptyMessage(1); } return true; } } return false; } }
public void unregisterReceiver(@NonNull BroadcastReceiver receiver) { HashMap var2 = this.mReceivers; synchronized(this.mReceivers) { ArrayListfilters = (ArrayList)this.mReceivers.remove(receiver); // 遍历filter if (filters != null) { for(int i = filters.size() - 1; i >= 0; --i) { LocalBroadcastManager.ReceiverRecord filter = (LocalBroadcastManager.ReceiverRecord)filters.get(i); filter.dead = true; // 遍历filter中action for(int j = 0; j < filter.filter.countActions(); ++j) { String action = filter.filter.getAction(j); ArrayList receivers = (ArrayList)this.mActions.get(action); if (receivers != null) { for(int k = receivers.size() - 1; k >= 0; --k) { LocalBroadcastManager.ReceiverRecord rec = (LocalBroadcastManager.ReceiverRecord)receivers.get(k); // 移除filter实现 if (rec.receiver == receiver) { rec.dead = true; receivers.remove(k); } } if (receivers.size() <= 0) { // 移除action this.mActions.remove(action); } } } } } } }
重点查看executePendingBroadcasts方法
void executePendingBroadcasts() { // while true进行循环receivers while(true) { HashMap var2 = this.mReceivers; LocalBroadcastManager.BroadcastRecord[] brs; synchronized(this.mReceivers) { int N = this.mPendingBroadcasts.size(); if (N <= 0) { return; } brs = new LocalBroadcastManager.BroadcastRecord[N]; this.mPendingBroadcasts.toArray(brs); this.mPendingBroadcasts.clear(); } // 找到每个receiver for(int i = 0; i < brs.length; ++i) { LocalBroadcastManager.BroadcastRecord br = brs[i]; int nbr = br.receivers.size(); for(int j = 0; j < nbr; ++j) { LocalBroadcastManager.ReceiverRecord rec = (LocalBroadcastManager.ReceiverRecord)br.receivers.get(j); // receiver存活状态调用receiver的onReceive方法 if (!rec.dead) { rec.receiver.onReceive(this.mAppContext, br.intent); } } } } }
通过遍历存储的receiver,调用receiver的onReceive方法实现广播的接收
BroadcastManager使用Binder机制实现,可以用作实现进程间通信,但是可以被其他app监听到,安全性差。
LocalBroadcastManager使用Handler实现,通过handler发送和接收消息的方式,实现应用内广播通信,安全性高。
转载地址:http://pioii.baihongyu.com/