欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

Android中广播接收者BroadcastReceiver详解

发布时间:2025/3/21 Android 67 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Android中广播接收者BroadcastReceiver详解 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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);

 

转载于:https://www.cnblogs.com/wanghaoyuhappy/p/5292733.html

总结

以上是生活随笔为你收集整理的Android中广播接收者BroadcastReceiver详解的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。