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

 更新时间:2022年12月26日 09:45:42   作者:落雪小轩韩  
Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件

一、广播机制概述

通常情况下在学校的每个教室都会装有一个喇叭,这些喇叭是接入到学校广播室的。如果有重要通知,会发送一条广播来告知全校师生。为了便于发送和接收系统级别的消息通知,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);

注意:数值越大,优先级越高。如果两个广播接收者的优先级相同,则先注册的广播接收者优先级高。

到此这篇关于Android四大组件之broadcast广播使用讲解的文章就介绍到这了,更多相关Android broadcast内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Android客户端实现注册、登录详解(1)

    Android客户端实现注册、登录详解(1)

    这篇文章主要为大家详细介绍了Android客户端实现注册、登录代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Android开发实现图片切换APP

    Android开发实现图片切换APP

    这篇文章主要介绍了Android开发实现图片切换APP,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • android实现添加耳机状态图标的方法

    android实现添加耳机状态图标的方法

    这篇文章主要介绍了android实现添加耳机状态图标的方法,较为详细的分析了Android实现添加耳机图标的原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android入门之Style与Theme用法实例解析

    Android入门之Style与Theme用法实例解析

    这篇文章主要介绍了Android入门之Style与Theme用法,非常实用的功能,需要的朋友可以参考下
    2014-08-08
  • 解析Android开发优化之:对界面UI的优化详解(二)

    解析Android开发优化之:对界面UI的优化详解(二)

    在一个应用程序中,一般都会存在多个Activity,每个Activity对应着一个UI布局文件。一般来说,为了保持不同窗口之间的风格统一,在这些UI布局文件中,几乎肯定会用到很多相同的布局
    2013-05-05
  • 学习理解Android菜单Menu操作

    学习理解Android菜单Menu操作

    这篇文章主要帮助大家理解Android菜单Menu操作,引入Android菜单Menu操作的知识,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • Android 自定义通用的loadingview实现代码

    Android 自定义通用的loadingview实现代码

    本篇文章主要介绍了Android 自定义通用的loadingview实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-01-01
  • Android MQTT与WebSocket协议详细讲解

    Android MQTT与WebSocket协议详细讲解

    MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议
    2022-11-11
  • Android中Json数据读取与创建的方法

    Android中Json数据读取与创建的方法

    android 读取json数据,下面小编给大家整理有关Android中Json数据读取与创建的方法,需要的朋友可以参考下
    2015-08-08
  • 分享安装Android Studio3.6的经验教训

    分享安装Android Studio3.6的经验教训

    这篇文章主要介绍了Android Studio3.6的安装错误问题及解决方法,非常值得大家参考,现把整个过程分享到脚本之家平台,需要的朋友参考下吧
    2020-02-02

最新评论