Android四大组件之broadcast广播使用讲解

作者:落雪小轩韩 时间:2023-07-27 12:41:50 

一、广播机制概述

通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了便于发送和接收系统级别的消息通知,Android系统也引入了一套类似广播的消息机制。

Android中的广播(Broadcast)机制用于进程/线程间通信,该机制使用了观察者模式,观察者模式是一种软件设计模式,该模式是基于消息的发布/订阅事件模型,该模型中的消息发布者是广播机制中的广播发送者,消息订阅者是广播机制中的广播接收者。

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,broadcast,广播组件
0
投稿

猜你喜欢

  • Android token过期刷新处理的方法示例

    2023-11-23 14:11:40
  • SpringBoot整合Groovy脚本实现动态编程详解

    2023-04-02 03:24:16
  • springboot大文件上传、分片上传、断点续传、秒传的实现

    2023-06-16 02:18:30
  • C语言 奇偶排序算法详解及实例代码

    2023-04-17 04:47:39
  • spring boot+vue实现JSAPI微信支付的完整步骤

    2023-07-31 13:39:26
  • Android Studio实现简易计算器设计

    2022-08-22 18:41:55
  • Java的Comparable,Comparator和Cloneable三大接口详解

    2023-07-14 11:18:48
  • 解决微服务中关于用户token处理到的坑

    2022-05-21 08:31:03
  • 23种设计模式(19)java责任链模式

    2021-10-19 15:04:00
  • Java实现有限状态机的推荐方案分享

    2022-01-07 15:54:27
  • 关于mybatis遇到Integer类型的参数时动态sql需要注意条件

    2021-10-13 04:59:39
  • 经典排序算法之冒泡排序(Bubble sort)代码

    2021-06-08 06:06:18
  • 手把手教你搞懂冒泡排序和选择排序

    2022-05-08 23:08:34
  • springboot快速集成mybatis-plus的详细教程

    2021-06-11 22:05:16
  • C#委托所蕴含的函数指针概念详细解析

    2023-06-03 15:26:13
  • Android中Notification通知用法详解

    2023-02-24 02:37:51
  • Android Handler,Message,MessageQueue,Loper源码解析详解

    2022-04-17 17:34:57
  • Android RichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

    2022-03-18 17:16:48
  • Unity实现卡片循环滚动效果的示例详解

    2022-06-06 16:04:47
  • 项目为什么引入log4j而不是logback代码

    2023-02-02 07:51:07
  • asp之家 软件编程 m.aspxhome.com