- LocalBroadcastManager 原理
LocalBroadcastManager思想是本地维护一个单例,然后在单例里进行
register,send,unregister
首先是register
,根据action,把receiver,intentfilter存入hashmap,这样 就在本地存了自己的receiver,intentfilter,action 等各种信息(其实就是这三个),hash只能是key,value,所以就包装成了对象进行保存,
synchronized (mReceivers) {
ReceiverRecord entry = new ReceiverRecord(filter, receiver);
ArrayList<IntentFilter> filters = mReceivers.get(receiver);
if (filters == null) {
filters = new ArrayList<IntentFilter>(1);
mReceivers.put(receiver, filters);
}
filters.add(filter);
for (int i=0; i<filter.countActions(); i++) {
String action = filter.getAction(i);
ArrayList<ReceiverRecord> entries = mActions.get(action);
if (entries == null) {
entries = new ArrayList<ReceiverRecord>(1);
mActions.put(action, entries);
}
entries.add(entry);
}
}
}
感觉android 这块写的太好了,(首先要知道 一个receiver有一个intentfilter,但是可以有多个action)
先是去创建一个ReceiverRecord对象,然后去根据receiver的hashmap中去找这个filter,看这个list是否为空,如果没有证明没有添加过这个receiver,那么把他添加上,添加完毕了,记得把这个filter添加到list中,这样就避免了重复创建对象,重复添加。(思想就是先判断添加,然后add)
其实就是先去获取这个value,看他是否有value,有添加过了,直接add,没有 就新建,然后在add
至此 就完成了register
2.然后是send
android send的作用就是把这个intent发送到receiver中,所以要做的就是根据这个action,然后找到对应的receiver,同时intentfilter要匹配,这样就可以send成功了
总结
register 的时候 把action作为key进行保存broadcast和intentfilter,然后send 的时候 根据action进行遍历,在传递给broadcastreceiver的receiver方法
网友评论