Android-Broadcast Receiver(广播接收器)

简单记录Broadcast Receiver(广播接收器)的简单实用
掘金:https://juejin.im/post/5cb0cf5de51d456e5633ddc5

1. 广播分类

1.1 Normal broadcasts 标准广播

完全异步的广播,所有的广播接收器几乎同时受到广播且无法截断。

1.2 Ordered broadcast 有序广播

显然对比与标准广播,有序广播就是有序的,可以设置各个接收器的优先级,可以被截断。

2. 注册全局广播接收器

全部广播代表,整个Android系统中的所有广播接收器都可以收到的广播

2.1 动态注册广播接收器

接受系统广播

主要步骤如下:

  1. 自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class NetWorkReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    networkInfo = connectivityManager.getActiveNetworkInfo();//需要申请权限
    if (networkInfo != null && networkInfo.isAvailable())
    Toast.makeText(context,"网络开启了",Toast.LENGTH_SHORT).show();
    else
    Toast.makeText(context,"网络关闭了",Toast.LENGTH_SHORT).show();
    }
    }
  2. 在代码中新建一个自定义广播接收器的实例,并在Activity中注册,注册时需要传入该广播接收器所接受的广播类型。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    private NetworkInfo networkInfo;
    private NetWorkReceiver netWorkReceiver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    intentFilter = new IntentFilter();
    netWorkReceiver = new NetWorkReceiver();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");//设置广播接收器接受的内容
    registerReceiver(netWorkReceiver,intentFilter);//注册广播接收器
    }
    }
  3. 在Activity的onDestroy方法中要取消注册广播接收器。

    1
    2
    3
    4
    5
    @Override
    protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(netWorkReceiver);
    }

此时变设置好了一个接受系统广播的广播接收器,当数据网络开关出现变化时,会接受到相应的广播并发出Toast信息。

2.2 注册静态广播接收器

静态广播接收器还有一个特性,那就是在系统没有启动的时候就能够接受广播并对他进行处理

2.2.1 接受系统广播(开机启动)
  1. 同样自定义广播接收器继承自BroadcastReceiver,并重写onReceive方法

    1
    2
    3
    4
    5
    6
    public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Toast.makeText(context,"开机了!",Toast.LENGTH_LONG).show();
    }
    }
  2. 在AndroidManifest.xml文件中注册(如果使用as自动创建的则自动注册)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <application
    >
    <activity android:name=".MainActivity">
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    </activity>
    //广播接收器注册
    <receiver android:name=".BootCompleteReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    <action
    android:name="android.intent.action.BOOT_COMPLETED"></action>
    </intent-filter>
    </receiver>
    </application>
2.3 发送自定义广播并接收

自定义的广播使用静态注册

2.3.1 发送标准广播
  1. 广播接收器注册

步骤同静态广播接收器一致,不过在AndroidManifest.xml文件中不仅仅注册时,广播接收器的标签里应该填写自己自定义的广播名

1
2
3
4
5
6
......
<intent-filter>
<action
android:name="com.override0330.example"></action>
</intent-filter>
......

  1. 发送广播-使用Intent发送:
    1
    2
    3
    4
    ......Java
    Intent intent = new Intent("com.override0330.example");
    sendBroadcast(intent);
    ......
2.3.2 发送有序广播
  1. 广播接收器注册

步骤同发送标准广播一致,但是多加入一个优先级的设置

1
2
3
4
5
6
......
<intent-filter android:priority="98">//设置优先级为98,最高为100
<action
android:name="com.override0330.example"></action>
</intent-filter>
......

  1. 发送有序广播

    1
    2
    Intent intent = new Intent("com.override0330.example");
    sendOrderBroadcast(intent, null);//null参数为一个与权限相关的字符串,一般情况传入null
  2. 截断广播

在想要截断的广播接收器的onReceive里使用

1
abortBroadcast();//截断该广播

3.使用本地广播

本地广播区别于全局广播,它只在本应用程序中传递,如果掌握了全局广播,那么本地广播的使用是非常简单的。而且貌似本地广播只能使用标准广播。
将上图中我们使用的注册广播接收器和发送广播的方法改为使用由LocalBroadcastManager的方法:

1
2
3
4
5
6
//获取LocalBroadManage实例
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
//发送本地广播
localBroadcastManager.sendBroadcast(intent);
//注册本地广播接收器
localBroadcastManager.registerReceiver(localBroadReceiver,intentFilter);

4. 总结

广播的使用还是相当简单的,但是它的底层实现还有待我的研究√