BroadcastReceiver和LocalBroadcastManager

BroadcastReceiver
1、发送和接收广播
    // 全局广播
    
    // 发送
        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
                }
            }
        }

    }
    
2、知识点梳理

(1)broadcastReceiver的响应时间为10s,超过10s无响应,将不会再次收到该广播

(2)onReceiver方法中不允许显示popUpWindow

LocalBroadcastManager

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);
            ArrayList<LocalBroadcastManager.ReceiverRecord> filters = (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<LocalBroadcastManager.ReceiverRecord> 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();
            Set<String> categories = intent.getCategories();
            boolean debug = (intent.getFlags() & 8) != 0;
            if (debug) {
                Log.v("LocalBroadcastManager", "Resolving type " + type + " scheme " + scheme + " of intent " + intent);
            }

            ArrayList<LocalBroadcastManager.ReceiverRecord> entries = (ArrayList)this.mActions.get(intent.getAction());
            if (entries != null) {
                if (debug) {
                    Log.v("LocalBroadcastManager", "Action list: " + entries);
                }

                ArrayList<LocalBroadcastManager.ReceiverRecord> 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) {
            ArrayList<LocalBroadcastManager.ReceiverRecord> filters = (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<LocalBroadcastManager.ReceiverRecord> 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发送和接收消息的方式,实现应用内广播通信,安全性高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值