Android四大组件之broadcast广播使用讲解
作者:落雪小轩韩 发布时间:2023-07-27 12:41:50
一、广播机制概述
通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了便于发送和接收系统级别的消息通知,Android系统也引入了一套类似广播的消息机制。
Android中的广播(Broadcast)机制用于进程/线程间通信,该机制使用了观察者模式,观察者模式是一种软件设计模式,该模式是基于消息的发布/订阅事件模型,该模型中的消息发布者是广播机制中的广播发送者,消息订阅者是广播机制中的广播接收者。
上述图中的广播机制的实现流程具体如下:
1、广播接收者是通过Binder机制在AMS(Activity Manager Service)中进行注册的 (在8.2小节会讲解广播接收者的注册)。
2、广播发送者是通过Binder机制向AMS发送广播。
3、AMS查找符合相应条件(IntentFilter/Permission)的广播接收者 (BroadcastReceiver),将广播发送到相应的消息循环队列中。
4、执行消息循环时获取到此广播,会回调广播接收者(BroadcastReceiver)中的 onReceive()方法并在该方法中进行相关处理。
二、广播接收者
Android系统中内置了很多广播,例如手机开机完成、电池电量不足时都会发送一条广播。
为了监听来自系统或者应用程序的广播事件,Android系统提供了BroadcastReceiver(广播接收者)组件。 当Android系统产生一个广播事件时,可以有多个对应的广播接收者接收并进行处理。
1、广播接收者的创建
1、通过在应用程序的包中创建一个类继承BroadcastReceiver并重写onReceive()方法来实现
2、通过选中应用程序中的包,右击选择【New】→【Other】→【Broadcast Receiver】选项来创建
public class MyBroadcast extends BroadcastReceiver {
@Override
// 当广播接收者接收广播成功,此方法会自动回调执行,在该方法中实现广播接收者的相关操作
public void onReceive(Context context, Intent intent) {
}
}
注意:创建完广播接收者之后还需要对广播接收者进行注册才可以接收广播。
2、广播接收者的注册
(1)静态注册
AndroidManifest.xml
清单文件中
<receiver
android:name=".utils.MyBroadcast"
android:enabled="true"
android:exported="true">
<intent-filter>
<action>cn.com.hello</action>
</intent-filter>
</receiver>
注意:静态注册广播,在小于Android8.0的设备上,只要设备处于开启状态,广播接收者就能接收到广播。Android8.0之后不支持静态注册方式。
(1)动态注册
<receiver
android:name=".utils.MyBroadcast"
android:enabled="true"
android:exported="true">
</receiver>
public class BroadcastReceiverActivity extends AppCompatActivity {
private MyBroadcast myBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_receiver);
// 创建广播接收者对象
myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
// 创建意图过滤器
IntentFilter intentFilter = new IntentFilter();
// 设置要过滤的广播
intentFilter.addAction(action );
// 注册广播接收者
registerReceiver(myBroadcast,intentFilter);
}
// 广播接收者是稀缺资源,使用结束要注销,可以在app销毁的阶段进行注销
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myBroadcast);
}
}
注意:动态注册的广播接收者是否被注销依赖于注册广播的组件,当组件销毁时,广播接收者也随之被注销。
三、广播的类型
1、无序广播
无序广播是完全异步执行,发送广播时所有监听这个广播的广播接收者都会接收到此消息,但接收的顺序不确定。
发送广播:
btn = findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 发送一次广播
Intent intent = new Intent();
intent.putExtra("info","hello,who are you ?");
// 设置广播的action,相当于广播的名称
String action = "cn.com.hello"
intent.setAction(action);
// 发送广播,广播会发送到信息中心,由信息中心负责找到这个广播的订阅者并将广播的意图传过去
// 无序广播
sendBroadcast(intent);
}
});
接收广播:
(1)MyBroadcast工具类文件:
public class MyBroadcast extends BroadcastReceiver {
@Override
// 当广播接收者接收广播成功,此方法会自动回调执行
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("info");
Log.v("msg","接收到了广播信息!");
}
}
(2)Activity文件
myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
registerReceiver(myBroadcast,intentFilter);
2、有序广播
按照接收者的优先级接收,只有一个广播接收者能接收消息,在此广播接收者中逻辑执行完毕后,才会继续传递。
发送广播:
Intent intent = new Intent();
intent.putExtra("info","hello,who are you ?");
String action = "cn.com.hello"
intent.setAction(action);
// 有序广播
sendOrderedBroadcast(intent,null);
接收广播:
(1)MyBroadcast工具类文件:
public class MyBroadcast extends BroadcastReceiver {
@Override
// 当广播接收者接收广播成功,此方法会自动回调执行
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("info");
Log.v("msg","接收到了广播信息!");
// 截断广播的发送,之后的广播接收者就接收不到广播了
abortBroadcast();
}
}
(2)Activity文件
myBroadcast = new MyBroadcast();
String action = "cn.com.hello"
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);
// 设置优先级
intentFilter.setPriority(8);
// 注册广播接收者
registerReceiver(myBroadcast,intentFilter);
注意:数值越大,优先级越高。如果两个广播接收者的优先级相同,则先注册的广播接收者优先级高。
来源:https://blog.csdn.net/m0_46613429/article/details/128278164


猜你喜欢
- 最近完成的差不多的项目突然需要加退款的流程需求了,所以来小小的实现以下。其实对比其他的支付和退款来说,支付宝算是特别专业,也是特别简单的一个
- 在android开发中,通常使用xml格式来描述布局文件。就目前而言,熟悉android布局及美化的人员少之又少,出现了严重的断层。大部分企
- 1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期 * 实现在
- drawerLayout是Support Library包中实现了侧滑菜单效果的控件,可以说drawerLayout是因为第三方控件如Men
- 本文实例为大家分享了java实现多个文件压缩的具体代码,供大家参考,具体内容如下需要用到的ant.jarpackage util;impor
- IO操作字节流java.io.InputStream 输入流,主要是用来读取文件内容的。java.io.OutputStream 输出流,主
- SpringMvc中普通类注入Service为null场景:使用Quartz定时器时,普通的java类需要注入spring的service类
- 主要功能设计:用户、区域、物质类型、物质详情、物质申请和审核以及我的申请和通知公告以及灵活控制菜单权限主要技术实现:spring、 spri
- 在java多线程程序中,所有线程都不允许抛出未捕获的checked exception,也就是说各个线程需要自己把自己的checked ex
- 本文实例为大家分享了java实现人工智能化屏幕监控窗口的具体代码,供大家参考,具体内容如下具体代码实现(含注释)public class M
- 缘由首先说明一下为什么会有这篇文章。前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术Dyna
- 前言xxljob 是采用 java 开发的开源的任务调度系统,架构上分为调度管理器、执行器,目前除了官方提供的 java 执行器外,也有 g
- Spring Security中的内置过滤器顺序是怎么维护的?我想很多开发者都对这个问题感兴趣。本篇我和大家一起探讨下这个问题。HttpSe
- 简介Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据。当一个线程调用excha
- 背景:SpringMVC如何响应json格式的数据?技术实现方式1:在Controller使用@RestController注解方式2:在C
- Android的主线程中执行长时间操作,导致界面无响应,会引起ANR。如果需要执行较长时间的操作,一般会在另一个线程处理,然后将数据转交给主
- 效果展示前面的导入过程这里就不多说了,不会的可以自己去问度娘。导入后,选择Spider.java类直接运行就可以了,下面是游戏运行的截图:游
- 1. 简单介绍嗨,大家好,今天给想给大家分享一下关于Mybatis-plus 的 Service 层的一些方法的使用。今天没有总结,因为都是
- 前言随着使用 Spring 进行开发的个人和企业越来越多,Spring 也慢慢从一个单一简洁的小框架变成一个大而全的开源软件,Spring
- Result也是Struts2比较重要的一部分,在Result的配置中常用的有四种类型:dispatcher、redirect、chain和