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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

uva 10061 How many zero's and how many digits ?(不同进制阶乘末尾几个0)+poj 1401

题意是求在base进制下的 n!的结果有几位数,末尾有几个0。 想起刚开始的时候做的一道10进制下的n阶乘末尾有几个零,以及之前有做过的一道n阶乘的位数。 当时都是在10进制下的。 10进制下的做法是: 1. n阶位数:直接 lg(n!)就是得数的位数。 2. n阶末尾0的个数:由于2 * 5 将会在得数中以0的形式存在,所以计算2或者计算5,由于因子中出现5必然出现2,所以直接一

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa