1. 接收系统的广播步骤
(1) 新建一个类继承BroadcastReceiver
以监听sd卡状态的广播接收者为例
1 public class SdCardBroadcastReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String action = intent.getAction();
6 if("android.intent.action.MEDIA_MOUNTED".equals(action)){
7 System.out.println("sd卡已挂载");
8 }else if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
9 System.out.println("sd卡已卸载");
10 }
11 }
12
13 }
形象一点的比喻, 这一步相当于买了个收音机
(2) 在清单文件中注册
1 <!-- 相当于装电池 -->
2 <receiver android:name="com.example.sdbroadcast.SdCardBroadcastReceiver">
3 <!-- 相当于调频道 -->
4 <intent-filter>
5 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
6 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
7 <data android:scheme="file"/>
8 </intent-filter>
9 </receiver>
这一步相当于装电池
(3) 在清单文件中添加意图过滤器,action里写监听的内容
1 <!-- 相当于调频道 -->
2 <intent-filter>
3 <action android:name="android.intent.action.MEDIA_MOUNTED"/>
4 <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
5 <data android:scheme="file"/>
6 </intent-filter>
这一步相当于调频道了
2. 发送自定义的无序广播
(1) 发送广播
1 public void startBroadcast(View view){
2 //开启广播
3 //创建一个意图对象
4 Intent intent = new Intent();
5 //指定发送广播的频道
6 intent.setAction("com.example.BROADCAST");
7 //发送广播的数据
8 intent.putExtra("key", "发送无序广播,顺便传递的数据");
9 //发送
10 sendBroadcast(intent);
11 }
(2) 接收广播
新建一个类,继承BroadcastReceiver
1 public class UnorderedReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String action = intent.getAction();
6
7 String data = intent.getStringExtra("key");
8
9 System.out.println("接受到了广播,action:"+ action +",data:"+data);
10
11 //接受到了广播,action:com.example.BROADCAST,data:发送无序广播,顺便传递的数据
12 }
13
14 }
记得在清单文件中进行注册
1 <receiver android:name="com.example.selfreceiver.UnorderedReceiver">
2 <intent-filter>
3 <action android:name="com.example.BROADCAST"/>
4 </intent-filter>
5 </receiver>
打印出的结果:
3. 发送自定义的有序广播
(1) 发送广播
1 // 发送有序广播
2 public void sendOrderedBroad(View view) {
3 Intent intent = new Intent();
4 intent.setAction("com.example.ORDERED");
5 // 发送无序广播
6 sendOrderedBroadcast(intent,//意图动作,指定action动作
7 null, //receiverPermission,接收这条广播具备什么权限
8 new FinalReceiver(),//resultReceiver,最终的广播接受者,广播一定会传给他
9 null, //scheduler,handler对象处理广播的分发
10 0,//initialCode,初始代码
11 "每人发10斤大米,不得有误!", //initialData,初始数据
12 null//initialExtras,额外的数据,如果觉得初始数据不够,可以通过bundle来指定其他数据
13 );
14 }
在上面的代码中,广播发送者发送了一条广播:"每人发10斤大米,不得有误!"
(2) 接收广播
新建一个类, 继承BroadcastReceiver,并在清单文件中进行注册
以下是所有的广播接收者在清单文件中的注册
权限从-1000 至 1000
1) 权限高的广播接收者可以修改广播,甚至可以终止广播
权限高的广播接收者1:
1 public class ShengReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5
6 //获取广播的数据
7 String data = getResultData();
8
9 //修改
10 setResultData("中央下达福利,每人5斤大米");
11
12 System.out.println("省政府收到指示, data : "+data);
13 }
14
15 }
在这里, 这个接收者修改广播为: "中央下达福利,每人5斤大米"
权限低的广播接收者
1 public class PeopleReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 //获取广播的数据
6 String data = getResultData();
7 System.out.println("老百姓收到福利,感谢党, data : "+data);
8 }
9
10 }
这样,在控制台打印出来的信息为:
权限低的接收者 接收到的广播就是修改后的了
2) 终止广播
权限高的广播接收者:
1 public class ShengReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5
6 //获取广播的数据
7 String data = getResultData();
8
9 //也可以终止广播,权限小的接收者就接收不到广播了
10 abortBroadcast();
11
12 System.out.println("省政府收到指示, data : "+data);
13 }
14
15 }
控制台打印:
权限小的就接收不到广播了....
(3) resultReceiver
可以在广播发送者的应用中建一个resultReceiver, 用于接收最终到达的广播,
无论广播是否终止,都会被resultReceiver接收
1 public class FinalReceiver extends BroadcastReceiver {
2
3 @Override
4 public void onReceive(Context context, Intent intent) {
5 String resultData = getResultData();
6 System.out.println("人民收到的最终福利是: "+ resultData);
7 }
8
9 }
控制台打印信息:
(终止广播后):
(修改广播后):
4. 补充:
有序广播和无序广播的区别:
有序广播:发送方发出后,几乎同时到达多个广播接收者处,某个接收者不能接收到广播后进行一番处理后传给下一个接收者,并且无法终止广播继续传播;Context.sendBroadcast(intent);
有序广播:广播接收者需要提前设置优先级,优先级高的先接收到广播,优先级数值为-1000~1000,在AndroidManifest.xml的<intent-filter android:priority="xxx">设置;比如存在3个广播接收者A、B、C,优先级A>B>C,因此A最先收到广播,当A收到广播后,可以向广播中添加一些数据给下一个接收者(intent.putExtra()),或者终止广播(abortBroadcast());Context.sendOrderedBroadcast(intent);