android之BroadcastReceiver(广播接收者)

2024-01-23 01:38

本文主要是介绍android之BroadcastReceiver(广播接收者),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BroadcastReceiver本意是广播接收者。这个也是android四大组件之一,广播其实我们也不难理解它,打个简单的比方,比如我们上课时,只要听到下课的铃声,这说明就要下课。在安卓中,广播是全局性的,每个应用都有可能接受到。下面就学习下怎么用广播接受者:

接下来我们就学习以下知识

  1. 静态注册广播
  2. 动态注册广播
  3. 普通广播
  4. 有序广播

静态注册广播

静态注册就是在清单文件里面注册

   <receiver
            android:name=".MyReceiver"><intent-filter><action android:name="edu.jju.broadcastreceiver"></action></intent-filter></receiver>

动态注册广播

就是通过java代码去注册而不是在清单文件里面去配置

  MyReceiver receiver=new MyReceiver();//广播接受者实例IntentFilter intentFilter=new IntentFilter();intentFilter.addAction("edu.jju.broadcastreceiver");registerReceiver(receiver,intentFilter);

注册广播就是这两种方式。接下来我们重点学习下普通广播跟有序广播

普通广播

1, 我么先定义一个类MyReceiver去继承BroadcastReceiver。并重写里面的方法

代码如下:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {public MyReceiver() {}@Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,"我接受到广播啦!!!",Toast.LENGTH_SHORT).show();}}

当有广播时,就会调用onReceive方法

MainActivity.java代码如下:


import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** 这是绑定按钮添加的事件* @param view*/public void send(View view) {/*这是通过静态注册的广播*/Intent intent = new Intent();intent.setAction("edu.jju.broadcastreceiver");sendBroadcast(intent);//发送普通广播}
}

运行结果:

这里写图片描述

也可以通过动态注册来实现,可以不需要在清单文件配置。修改的代码如下:

   /*** 这是绑定按钮添加的事件* @param view*/public void send(View view) {MyReceiver receiver = new MyReceiver();//广播接受者实例IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("edu.jju.broadcastreceiver");registerReceiver(receiver, intentFilter);Intent intent = new Intent();intent.setAction("edu.jju.broadcastreceiver");sendBroadcast(intent);//发送普通广播}

运行效果是一样的

有序广播

接下来我们定义四个广播来演示下 A B C D,然后它们是接收相同的广播。

       <receiver android:name=".MyReceiver"><intent-filter><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverA"><intent-filter><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverB"><intent-filter><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverC"><intent-filter><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver>

可以看到,我们是通过静态注册的方式,而且是接受相同的广播, 在每个广播接收者中打印log

然后运行:

这里写图片描述

可以看到,我们发送一条广播,广播接收者都接受到了该广播。默认的是按在清单文件注册顺序接受的。我们可以改它们的优先级

修改代码如下

     <receiver android:name=".MyReceiver"><intent-filter android:priority="100"><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverA"><intent-filter android:priority="200"><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverB"><intent-filter android:priority="50"> <action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver><receiver android:name=".MyReceiverC"><intent-filter android:priority="300"><action android:name="edu.jju.broadcastreceiver" /></intent-filter></receiver>

优先级设置为MyReceiver 100 , MyReceiverA 200 , MyReceiverB 50 , MyReceiverC 300

再运行下

这里写图片描述

可以看到优先级高的,先接收到广播

我们也可以截断这条广播,我们就在MyReceiverA 这里截断试下

修改下MyReceiverA 代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;public class MyReceiverA extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.i("TAG", " MyReceiverA 广播 ");abortBroadcast();//截断广播}
}

再运行下:
这里写图片描述

可以看到只有两个接收到了该广播,说明是被截断了

总结:

写的不是太好,只是讲了怎么用,我也是一名初学者。争取下次博客结合案例来写。

源码下载

https://github.com/songshuilin/AndroidForBlog/tree/master/androidforbroadcastreceiver

这篇关于android之BroadcastReceiver(广播接收者)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/634864

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整