iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android之 BroadcastReceiver广播接收器详解
  • 737
分享到

Android之 BroadcastReceiver广播接收器详解

android 2023-09-22 22:09:48 737人浏览 八月长安
摘要

一 四大组件 1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 2 service组件,用于在后台完成用户指定的操作。 3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数

一 四大组件

1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。

2 service组件,用于在后台完成用户指定的操作。

3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数据库、文件。

4 broadcast receiver组件,是程序之间传递信息时的一种机制,作用就是接收或者发送通知。

二 broadcast receiver简介

1 broadcast receiver做为四大组件之一,负责组件之间消息的传递和接收。

2 采用观察者模式,基于消息的发布/订阅事件模型,通过Binder机制进行消息的注册和接收。

3 广播中的角色:

  • 消息订阅者(广播接收者)
  • 消息发布者(广播发布者)
  • 消息中心(AMS,即Activity Manager Service)

4  广播的工作流程:

  • 广播接收者通过 Binder机制在AMS注册
  • 广播发送者通过 Binder 机制向AMS发送广播
  • AMS根据广播发送者要求,在已注册列表中,寻找合适的广播接收者(寻找依据:IntentFilter / Permission)
  • AMS将广播发送到合适的广播接收者相应的消息循环队列中;
  • 广播接收者通过消息循环拿到此广播,并回调 onReceive()

三 广播的注册

1 注册类型有两种:静态注册和动态注册

2 静态注册,即在清单文件中注册

第一步:创建一个广播接收器BroadcastReceiver ,广播也是通过Intent来传递数据。

public class MyReceiver extends BroadcastReceiver {    private static final String TAG = "MyReceiver";    @Override    public void onReceive(Context context, Intent intent) {        String msg=intent.getStringExtra("msg");        Log.e(TAG, "onReceive: "+msg);    }}

第二步,清单文件注册该广播

第三步:在其它组件里面发送广播,比如Activity里面

private void buttonClick(){Intent intent = new Intent(this, MyReceiver.class);sendBroadcast(intent);}

3 注意:

Android 8.0以后版本对静态注册的广播做了限制,自定义的接收器会接收不到发送方发送的广播。发送方需要在intent中设定接收方的package,接收方才会接收到。如下:

Intent intent = new Intent();intent.setAction("cn.dinghe.test");intent.setClass(this,Class.forName("cn.dinghe.test.MyReceiver"));sendBroadcast(intent);

4 动态注册:即通过 reGISterReceiver 注册

第一步:一样先创建广播接收器

public class MyReceiver extends BroadcastReceiver {    private static final String TAG = "MyReceiver";    @Override    public void onReceive(Context context, Intent intent) {        String msg=intent.getStringExtra("msg");        Log.e(TAG, "onReceive: "+msg);    }}

第二步:在组件如Activity里面动态注册广播

public class MainActivity extends AppCompatActivity {      MyReceiver myReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //动态注册广播        myReceiver=new MyReceiver();        IntentFilter intentFilter=new IntentFilter();        intentFilter.addAction("com.dinghe.test.myAction");        registerReceiver(myReceiver,intentFilter);    }}

第三步:在任意组件里面发送广播

private void buttonClick(){Intent intent=new Intent();intent.setAction("com.dinghe.test");intent.putExtra("mag","你好啊");sendBroadcast(intent);}

第四步:取消注册,不然容易造成内存泄漏

@Overrideprotected void onDestroy() {super.onDestroy();if (myReceiver!=null){unregisterReceiver(myReceiver);}}

五 有序广播

1 有序广播介绍:

  • 有序广播是一种同步执行的广播,广播发出之后,优先级高的广播接收器就可以先接收到广播消息。
  • 执行完该广播接收器的逻辑后,可以选择截断正在传递的广播或者继续传递,如果广播消息被截断,之后的广播接收器则无法收到广播消息。
  • 有序广播中的“有序”是针对广播接收者而言的。有序广播的定义过程与普通广播无异,只是其发送方式变为:sendOrderedBroadcast()。
  • 有序广播的接收者们将按照事先命的优先级依次接收,数越大优先级越高(取值范围:-1000~10000)
  • 优先级可以声明在 
  • 也可以调用IntentFilter对象的 setPriority() 设置
  • 调用abortBroadcast()方法即可终止,一旦终止后面接收者就无法接受广播

2 实战:

第一步,创建有序广播接收器

public class MyOrderBroadcastReceiver extends BroadcastReceiver {    private static final String TAG = "MyOrderBroadcastReceive";    @Override    public void onReceive(Context context, Intent intent) {        String action=intent.getAction();        String msg=intent.getStringExtra("msg");        switch (action){            case "BROADCAST_ACTION1":    break;            case "BROADCAST_ACTION2":    break;        }    }}

第二步:清单文件里面注册有序广播 ,并设置优先级

                                    

或者动态注册并设置广播优先级 

IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("BROADCAST_ACTION2");intentFilter.setPriority(2);registerReceiver(mBroadcastReceiver, intentFilter);

第三步:发送广播

Intent intent = new Intent();intent.setAction("BROADCAST_ACTION2");intent.putExtra("msg","你好啊");sendOrderedBroadcast(intent, null);

第四步:拦截有序广播,在接收器里面拦截abortBroadcast();

public class MyOrderBroadcastReceiver extends BroadcastReceiver {    private static final String TAG = "MyOrderBroadcastReceive";    @Override    public void onReceive(Context context, Intent intent) {        String action=intent.getAction();        String msg=intent.getStringExtra("msg");        switch (action){            case "BROADCAST_ACTION1":                break;            case "BROADCAST_ACTION2":                //优先级高,先收到消息,可以拦截断开有序广播,不再执行下一广播                abortBroadcast();                break;        }    }}

六 应用内广播(LocalBroadcast)

1 Android中的广播可以跨进程甚至跨App直接通信,且注册是exported对于有intent-filter的情况下默认值是true,由此将可能出现安全隐患如下:

  • 其他App可能会针对性的发出与当前App intent-filter相匹配的广播,由此导致当前App不断接收到广播并处理;
  • 其他App可以注册与当前App一致的intent-filter用于接收广播,获取广播具体信息。

2  解决款进程上面隐患方案如下:

  • 对于同一App内部发送和接收广播,将exported属性人为设置成false,使得非本App内部发出的此广播不被接收;
  • 在广播发送和接收时,都增加上相应的permission,用于权限验证;
  • 发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。

3  LocalBroadcastManage处理App内广播

Android v4兼容包中给出了封装好的LocalBroadcastManager类,用于统一处理App应用内的广播问题,使用方式上与通常的全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将主调context变成了LocalBroadcastManager的单一实例。使用方式如下:

//registerReceiver(mBroadcastReceiver, intentFilter);//注册应用内广播接收器LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);//unregisterReceiver(mBroadcastReceiver);//取消注册应用内广播接收器localBroadcastManager.unregisterReceiver(mBroadcastReceiver);Intent intent = new Intent();intent.setAction(BROADCAST_ACTION);//sendBroadcast(intent);//发送应用内广播localBroadcastManager.sendBroadcast(intent);

七 常用系统广播

1 Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播。

2 当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播

3 每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:

监听网络变化
android.net.conn.CONNECTIVITY_CHANGE

关闭或打开飞行模式
Intent.ACTION_AIRPLANE_MODE_CHANGED

充电时或电量发生变化
Intent.ACTION_BATTERY_CHANGED

电池电量低
Intent.ACTION_BATTERY_LOW

电池电量
Intent.ACTION_BATTERY_OKAY

系统启动完成后(仅广播一次)
Intent.ACTION_BOOT_COMPLETED

按下照相时的拍照按键(硬件按键)时
Intent.ACTION_CAMERA_BUTTON

屏幕
Intent.ACTION_CLOSE_SYSTEM_DIALOGS

设备当前设置被改变时(界面语言、设备方向等)
Intent.ACTION_CONFIGURATION_CHANGED

插入耳机时
Intent.ACTION_HEADSET_PLUG

未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡)
Intent.ACTION_MEDIA_BAD_REMOVAL

插入外部储存装置(如SD卡)
Intent.ACTION_MEDIA_CHECKING

成功安装APK
Intent.ACTION_PACKAGE_ADDED

成功删除APK
Intent.ACTION_PACKAGE_REMOVED

重启设备
Intent.ACTION_REBOOT

屏幕被关闭
Intent.ACTION_SCREEN_OFF

屏幕被打开
Intent.ACTION_SCREEN_ON

关闭系统时
Intent.ACTION_SHUTDOWN

重启设备
Intent.ACTION_REBOOT

4 示例,比如监听事件分钟变化

 第一步:创建时间变化监听器

BroadcastReceiver mTimeUpdateReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent == null) {return;}String action = intent.getAction();if (action == null || action.isEmpty()) {return;}if (action.equals(Intent.ACTION_TIME_TICK)) {//system every 1 min send broadcastLog.e(TAG, "onReceive: " + Config.FOOTPRINTTIME);}}};

第二步:注册系统监听

private void registerUpdateTimeReceiver() {//register time updateIntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_TIME_TICK);registerReceiver(mTimeUpdateReceiver, filter);}

 第三步:取消系统时间监听

private void unRegisterUpdateTimeReceiver() {if (mTimeUpdateReceiver != null) {unregisterReceiver(mTimeUpdateReceiver);}}

八 广播的其它方式

1 广播的作用就是会主动监听并接收数据变化,但广播是系统组件,需要传上下文,使用不规范可能会造成内存泄漏。而且系统的更新可能会限制广播的某些功能使用,于是也出现了基于发布/订阅模式的其它框架,比如使用非常广泛的EventBus。

2 EventBus 优点:

  • 调度灵活,不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。
  • 父类对于通知的监听和处理可以继承给子类,这对于简化代码至关重要。
  • 通知的优先级,能够保证 Subscriber 关注最重要的通知。
  • 粘滞事件 (sticky events) 能够保证通知不会因 Subscriber 的不在场而忽略

3 当然使用广播和EventBus都能达到监听消息的机制,可以根据自己情况选择。还有其它类似的发送/接收机制的框架,比如配合网络请求使用的RxJava,LiveData等。

来源地址:https://blog.csdn.net/qq_29848853/article/details/130645245

--结束END--

本文标题: Android之 BroadcastReceiver广播接收器详解

本文链接: https://www.lsjlt.com/news/415798.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android之 BroadcastReceiver广播接收器详解
    一 四大组件 1 Activity组件,它一个单独的窗口,程序流程都必须在Activity中运行。 2 service组件,用于在后台完成用户指定的操作。 3 content provider组件,会为所有的应用准备一个内容窗口,并且保留数...
    99+
    2023-09-22
    android
  • Android 广播接收器BroadcastReceiver详解
    目录一、什么是BroadcastReceiver1.1、作用1.2、实现原理二、创建广播接收器三、注册广播接收器3.1、静态注册注册发送通知3.2、动态注册四、系统广播总结一、什么是...
    99+
    2024-04-02
  • Android组件之BroadcastReceiver广播接收者
    目录本节引言1.BroadcastReceiver是什么?2.两种广播类型:3.接收系统广播1)两种注册广播的方式2)动态注册实例(监听网络状态变化)3)静态注册实例(接收开机广播)...
    99+
    2023-05-16
    Android BroadcastReceiver Android 组件
  • Android四大组件之广播BroadcastReceiver详解
    定义 BroadcastReceiver,“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。在Android系统中,广播体现在方方面面,例如当开机完成后系统会产...
    99+
    2024-04-02
  • [Android]App之间发送和接收广播
    这里使用不同模块来实现app之间的广播通信,以两个app为例,通过点击按钮来实现的~   1. broad模块 - 忽略BootCompleteReceiver和MainActivity(这是其他的~)  步骤: (1)创建 BroadO...
    99+
    2023-09-18
    android java 开发语言
  • Android自定义广播接收
    本文实例为大家分享了Android自定义广播接收的具体代码,供大家参考,具体内容如下 实现效果: MainActivity.java代码: package com.henu.b...
    99+
    2024-04-02
  • Android四大组件之broadcast广播详解
    目录基础广播两大类广播广播的动态和静态注册监听时间变化监听系统启动案例创建 receiver设置权限发送自定义广播如何发送与接收有序广播基础广播 两大类广播 标准广播:异步执行,广播...
    99+
    2024-04-02
  • Android四大组件之BroadcastReceiver详解
    BroadcastReceiver是Android四大组件之一,用于接收和处理系统广播或者应用内发送的广播。广播是一种跨组件、跨应用的通信机制,可以用于在应用内部或者应用之间传递消息或者事件。BroadcastReceiver的主要作用...
    99+
    2023-08-09
    Android
  • 怎么在Android中接收自定义广播
    本篇文章给大家分享的是有关怎么在Android中接收自定义广播,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MainActivity.java代码:package c...
    99+
    2023-06-15
  • android系统广播收不到了怎么解决
    如果你的Android设备无法收到广播,可以尝试以下解决方法:1. 检查应用权限:确保你的应用已经获得了适当的权限以接收广播。在An...
    99+
    2023-09-25
    android
  • Android启动内置APK和动态发送接收自定义广播实例详解
    Android启动内置APK和动态发送接收自定义广播实例详解工作中遇到这样一个需求,需要为按键添加一个亲情号,提供一个接口启动内置的APK,思考再三决定更改Framework,利用广播机制去实现。一、代码动态自主启动内置APK我们都知道An...
    99+
    2023-05-31
    android 内置apk 广播
  • 详解Android广播Broadcast的启动流程
    Android中的广播是一种用于应用程序之间通信的机制。它允许应用程序发送和接收系统级或应用程序级的广播消息。当一个广播被发送时,系...
    99+
    2023-08-11
    Android
  • Android 给广播接收器增加权限(permission)或signature签名权限
    一. 普通权限 添加权限         当普通广播接收器需要增加权限时,需要在广播接收器所在的AndroidManifest.xml 文件中添加权限: 注:我查到的资料是在广播接收器所在的AndroidManifest....
    99+
    2023-09-27
    android
  • Android四大组件之broadcast广播使用讲解
    目录一、广播机制概述二、广播接收者1、广播接收者的创建2、广播接收者的注册三、广播的类型1、无序广播2、有序广播一、广播机制概述 通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭...
    99+
    2022-12-26
    Android broadcast Android broadcast广播组件
  • Android studio 广播的简单使用代码详解
    1.在布局文件里面加入按钮,等会发送广播 <?xml version="1.0" encoding="utf-8"?> <LinearLayou...
    99+
    2024-04-02
  • Struts2之Action接收请求参数和拦截器详解
    技术分析之在Struts2框架中使用Servlet的API1. 在Action类中也可以获取到Servlet一些常用的API需求:提供JSP的表单页面的数据,在Action中使用Servlet的API接收到,然后保存到三个域对象中,最后再显...
    99+
    2023-05-31
    struts 拦截 action
  • Flutter使用Android原生播放器详解
    接上篇:播放器-IOS(Swift)篇 安卓端原生播放器的接入思路与ios基本一致,所以本篇就不废话了,直接上代码: 创建插件VideoViewPlugin实现FlutterPlug...
    99+
    2023-02-28
    Flutter播放器 Android Flutter播放器 Flutter原生播放器
  • golang中的nil接收器详解
    我们先看一个简单的例子,我们自定义一个错误,用来把多个错误放在一起输出: type CustomError struct {errors []string} func (c *Cus...
    99+
    2024-04-02
  • Java 流处理之收集器详解
    Java 流(Stream)处理操作完成之后,我们可以收集这个流中的元素,使之汇聚成一个最终结果。这个结果可以是一个对象,也可以是一个集合,甚至可以是一个基本类型数据。 以记录&nb...
    99+
    2024-04-02
  • javaCV开发详解之收流器实现
    本章基于javaCV实现收流器功能和录制功能 补充:基于本功能可以实现远程流媒体服务器实时视频录制到本地 一、开发所依赖的包 javacv.jar,javacpp.jar,ffmpe...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作