文章目录
  1. 1. 概念总结
  2. 2. 广播接收器
  3. 3. 发送广播
    1. 3.1. 标准广播
    2. 3.2. 有序广播
  4. 4. 本地广播

概念总结

Android中的广播分成标准广播(Normal broadcasts一直完全异步执行的广播所有接收器同时受到这个广播,没有先后顺序)和有序广播(Ordered broadcasts广播接收器按照优先级依次接收广播,优先级高的广播可以截断广播)。

广播接收器

广播接收类必须继承自BroadcastReceiver,并重写父类的onReceive()方法定义接收到广播之后的操作。
广播接收器有两种注册方式,在代码中动态的注册和在AndroidManifest.xml 中静态的注册。
下面是动态注册的基本例子,首先声明一个类继承制BroadcastReceiver,并复写其中的onReceive()方法

1
2
3
4
5
6
7
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "network changes",
Toast.LENGTH_SHORT).show();
}
}

接着在注册这个接收器的时候,首先通过IntentFilter定义需要接受的动作,新建这个广播接收器对象并将其注册

1
2
3
4
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);

最后在不需要这个广播接收器时,需要将其取消注册

1
unregisterReceiver(networkChangeReceiver);

下面是静态的注册广播接收器,非常简单,只需要在AndroidManifest.xml中声明一个接收器,给出其类名,以及需要接收的Intent

1
2
3
4
5
<receiver android:name=".BootCompleteReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>

发送广播

标准广播

发送标准广播,只要在Intent对象中填入所需的广播名,在调用sendBroadcast()发送这个广播即可

1
2
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

有序广播

和标准广播的区别就是发送广播时使用sendOrderedBroadcast()方法发送有序广播

1
2
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendOrderedBroadcast(intent, null);

其中第一个参数是Intent,第二个参数表示权限,在注册广播接收器的时候,可以通过android:priority 属性给广播接收器设置优先级

1
2
3
4
5
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="100" >
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>

在接收到广播之后,可以在广播接收器中的onReceive()方法中使用abortBroadcast()方法将宝宝截断,后面优先级低于100的广播接收器就收不到该广播了。

本地广播

前面所说的广播都是属于系统广播,可以被其他程序截获,为了数据的安全性Android还有一套本地广播机制,即的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播
本地广播主要使用LocalBroadcastManager对广播进行管理,首先通过getInstance方法获取LocalBroadcastManager对象实例

1
localBroadcastManager = LocalBroadcastManager.getInstance(this);

在发送广播的时候,使用LocalBroadcastManager.sendBroadcast方法发送本地广播

1
2
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);

在注册广播接收器时使用localBroadcastManager.registerReceiver方法注册广播接收器,广播接收器中onReceiver和非本地广播一样

1
2
3
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);// 注册本地广播监听器

另外,本地广播接收器是无法进行静态注册的,因为静态注册就是为了程序在不运行的状态下也能接受广播,在本地广播的应用场景下不需要。

文章目录
  1. 1. 概念总结
  2. 2. 广播接收器
  3. 3. 发送广播
    1. 3.1. 标准广播
    2. 3.2. 有序广播
  4. 4. 本地广播