BroadcastReceiver广播

知识背景

广播是一种可以跨进程的通信方式

全局广播

定义广播接收者

1
2
3
4
5
6
7
8
9
10
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
//onReceive函数不能做耗时的事情 参考值10s内
}
}

注册

静态注册

在AndroidManifest.xml注册

1
2
3
4
5
6
7
8
9
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.cczhr.broadcasttest.MY_BROADCAST"/>
<!--这里指定MyReceiver所要接收的广播名字-->
</intent-filter>
</receiver>

动态注册注销

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//注册模块
if(receiver==null){
receiver=new MyReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("com.cczhr.broadcasttest.MY_BROADCAST");
//这里指定MyReceiver所要接收的广播名字
registerReceiver(receiver,intentFilter)
}
//注销模块
if(receiver!=null){
unregisterReceiver(networkChangeReceiver);
}
private IntentFilter intentFilter;
private MyReceiver receiver =null;

发送广播

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

有序广播

优先级别越高越先收到广播而且能阻断下一个接收者接收。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--这里指定优先级-->
<intent-filter android:priority="100">
<action android:name="com.cczhr.broadcasttest.MY_BROADCAST"/>
<!--这里指定MyReceiver所要接收的广播名字-->
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<!--这里指定优先级-->
<intent-filter android:priority="90">
<action android:name="com.cczhr.broadcasttest.MY_BROADCAST"/>
<!--这里指定MyReceiver所要接收的广播名字-->
</intent-filter>
</receiver>

MyReceiver

1
2
3
4
5
6
7
8
9
10
11
12
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
//onReceive函数不能做耗时的事情 参考值10s内
abortBroadcast();
//截断广播,这时MyReceiver2接收不了广播
}
}

本地广播

使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private LocalReceiver localReceiver;
//注册本地广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.cczhr.broadcasttest.MY_BROADCAST");//可以设置多个
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
....
//处理收到的信息
class LocalReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(com.cczhr.broadcasttest.MY_BROADCAST){
//dosomething
}
}
}
//最后在注册的onDestroy取消注册
...
LocalBroadcastManager.getInstance(this).unregisterReceiver( localReceiver);
....
//发送本地广播
localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
Intent intent = new Intent("com.cczhr.broadcasttest.MY_BROADCAST");
localBroadcastManager.sendBroadcast(intent); //传Intent