android ,关于广播接收者的两种不同方式的用法及区别

2023-12-22 22:48

本文主要是介绍android ,关于广播接收者的两种不同方式的用法及区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(1)代码中动态注册

步骤如下:

  1. 实例化自定义的广播接收者
  2. 实例化意图过滤器,并设置要过滤的广播类型(如,我们接收收到短信系统发出的广播)
  3. 使用Context的registerReceiver(BroadcastReceiver, IntentFilter, String, Handler)方法注册广播

代码:

//new出上边定义好的BroadcastReceiver
MyBroadCastReceiver yBroadCastReceiver = new MyBroadCastReceiver();//实例化过滤器并设置要过滤的广播  
IntentFilter intentFilter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");//注册广播   
myContext.registerReceiver(smsBroadCastReceiver,intentFilter, "android.permission.RECEIVE_SMS", null);

(2)在Manifest.xml中静态注册

直接在Manifest.xml文件的<application>节点中配置广播接收者。

 <receiver android:name=".MyBroadCastReceiver">  <!-- android:priority属性是设置此接收者的优先级(从-1000到1000) --><intent-filter android:priority="20"><actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>  </intent-filter>  
</receiver>

还要在<application>同级的位置配置可能使用到的权限

<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission>

(3)两种注册广播的不同

  1. 第一种不是常驻型广播,也就是说广播跟随程序的生命周期。
  2. 第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

二.发送广播

当我们需要发送一个自定义的广播来通知程序中其他组件一些状态时,就可以使用发送一条广播的方式。

有两种方式分别发送两种不同的广播:
通过mContext.sendBroadcast(Intent)mContext.sendBroadcast(Intent, String)发送的是无序广播(后者加了权限);
通过mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)发送的是有序广播。

区别
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。

(1)无序广播的使用:

定义一个按钮,设置其点击事件,发送一个无序广播。

        Intent intent = new  Intent();//设置intent的动作为com.example.broadcast,可以任意定义intent.setAction("com.example.broadcast");//发送无序广播sendBroadcast(intent);

定义一个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver extends BroadcastReceiver {public MyReceiver() {}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"收到广播", Toast.LENGTH_SHORT).show();}
}

在Manifest.xml中配置该接收者。

<receiverandroid:name=".MyReceiver" ><intent-filter><!-- 动作设置为发送的广播动作 --><action android:name="com.example.broadcast"/></intent-filter>
</receiver>

运行结果为:Toast打印出 “收到广播”。

(2)有序广播的使用

和无序广播使用不同的是 通过 mContext.sendOrderedBroadcast(Intent, String, BroadCastReceiver, Handler, int, String, Bundle)和每个接收者设置优先级,就可以在小于自己优先级的接收者得到广播前,修改或终止广播。

定义一个按钮,设置其点击事件,发送一个有序广播。

        Intent intent = new  Intent();//设置intent的动作为com.example.broadcast,可以任意定义intent.setAction("com.example.broadcast");//发送无序广播//第一个参数:intent//第二个参数:String类型的接收者权限//第三个参数:BroadcastReceiver 指定的接收者//第四个参数:Handler scheduler//第五个参数:int 此次广播的标记 //第六个参数:String 初始数据//第七个参数:Bundle 往Intent中添加的额外数据sendOrderedBroadcast(intent, null, null, null, "这是初始数据", );

定义多个广播接收者,来接收这个广播事件。通过Toast的打印判断是否收到广播

public class MyReceiver1 extends BroadcastReceiver {public MyReceiver1() {}@Overridepublic void onReceive(Context context, Intent intent) {//获取广播中的数据(即得到 "这是初始数据" 字符串)String message = getResultData();Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();//修改数据setResultData("这是修改后的数据");}
}
public class MyReceiver2 extends BroadcastReceiver {public MyReceiver2() {}@Overridepublic void onReceive(Context context, Intent intent) {String message = getResultData();Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();//终止广播abortBroadcast();}
}
public class MyReceiver3 extends BroadcastReceiver {public MyReceiver3() {}@Overridepublic void onReceive(Context context, Intent intent) {String message = getResultData();Toast.makeText(context ,message ,Toast.LENGTH_SHORT).show();}
}

在Manifest.xml中配置该接收者。并设置优先级:MyReceiver1>MyReceiver2>MyReceiver3。

<!-- 优先级相等的话,写在前面的receiver的优先级大于后面的 -->
<receiverandroid:name=".MyReceiver1" ><!-- 定义广播的优先级 --><intent-filter android:priority="1000">                <!-- 动作设置为发送的广播动作 --><action android:name="com.example.broadcast"/></intent-filter>
</receiver>
<receiver android:name=".MyReceiver2" ><!-- 定义广播的优先级 --><intent-filter  android:priority="0"><!-- 动作设置为发送的广播动作 --><action android:name="com.example.broadcast"/></intent-filter>
</receiver>
<receiver android:name=".MyReceiver3" ><!-- 定义广播的优先级 --><intent-filter  android:priority="-1000"><!-- 动作设置为发送的广播动作 --><action android:name="com.example.broadcast"/></intent-filter>
</receiver>

运行结果:MyReceiver1得到广播数据后打印“这是初始数据”,MyReceiver2接收到广播数据打印“这是修改后的数据”,MyReceiver3没有打印。



文/世界是我的床(简书作者)
原文链接:http://www.jianshu.com/p/ea5e233d9f43
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

这篇关于android ,关于广播接收者的两种不同方式的用法及区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/525754

相关文章

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用