Android - 广播

2019-02-22  本文已影响0人  just0119

定义

- android四大组件之一,
- 一个全局监听器,用来监听接收应用发出的消息
- 分为广播接收者和广播发送者
- 一般用来进行组件间通信,以及和android系统间通信比如监听网络状态,开机状态

原理

- 使用设计模式中的观察者模式,基于消息的发布订阅模型
- 模型示意图
image.png

分类及使用流程

## 广播分类
      - 无序广播(普通广播)
      - 系统广播:需要申请对应权限,注册对应广播接收者即可
      - 有序广播
          1. 发送出去的广播按照先后顺序进行接收
          2. 通过设置priority属性值可以设置广播优先级,优先级相同,动态注册广播优先
          3. 优先级高的广播可以通过调用BroadCastReceiver的abortBroadCast()方法终止广播,后面优先级低的则无法接收广播
          4. 优先级高的广播可以通过setResultExtras(Bundle)将参数传递给优先级低的广播,低优先级的可以通过getResultExtras(true)获取参数
  
  ## 广播注册方式
      - 静态注册
          1. 直接在Androidmanifest文件中进行注册
          ```  
            <receiver android:name=".MyReceiver"
                  android:enabled="true"
                  android:exported="true">
                    <intent-filter>
                    <action android:name="CCJJQQ"/>
                  </intent-filter>
              </receiver> 
         ```
         2. receiver的属性值:
              2.1 android:enabled   能否接收其他App的发出的广播
              2.2 android:exported=["true" | "false"]  默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
              2.3 android:permission="string" 具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收
              2.4 android:process="string"  BroadcastReceiver运行所处的进程,默认为app的进程,可以指定独立的进程
        
      - 动态注册
          在代码中进行注册
        ```
           MyReceiver receiver = new MyReceiver();
           IntentFilter filter = new IntentFilter();
           filter.addAction("CCJJQQ");
           registerReceiver(receiver,filter);
        ```
      - 区别:动态注册广播生命周期和activity相同,而静态注册不受启动activity的影响
    ## 广播接收
        ```
          public class MyReceiver extends BroadcastReceiver {
            @Override
             public void onReceive(Context context, Intent intent) {
                  if(Objects.equals(intent.getAction(), "CCJJQ"))
                  Toast.makeText(context,"cccq",Toast.LENGTH_SHORT).show();
                }
            }
        ```
    ## 广播发送
        - 发送普通广播  sendBroadCast(intent);
        - 发送有序广播  sendOrderBroadCast(intent);
        - 发送粘性广播  sendStickyBroadCast(intent)  可以发送给未注册的广播
        - 还有一种本地发送广播,只在本应用中发送广播,且必须动态注册
            ```      
       LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
            ```
  # 注意点
         - 广播接收在主线程,不能做耗时操作
         - 需要取消注册

[参考链接] https://www.jianshu.com/p/ca3d87a4cdf3

上一篇 下一篇

猜你喜欢

热点阅读