Android四大组件之BroadcastReceiver

什么是BroadcastReceiver?

      BroadcastReceiver(广播接收器),顾名思义,是用来接收广播的。Android内部实现了一套广播通信机制,即在某个应用或某个组件注册广播接收器,接收特定类型的广播。当别的应用或组件发送该类型的广播时,注册广播接收器的组件或应用就能接收到该广播,并执行相应的操作,这非常类似于观察者模式。

 

如何使用BroadcastReceiver?

      BroadcastReceiver使用起来非常简单,我们只需要先自定义一个广播接收器,然后在想要接收广播的组件中注册该广播接收器。当别的组件发送广播的时候,广播接收器就能收到该广播,然后执行相应的操作就可以了。下面将一步步介绍广播接收器的具体使用方法。

1.自定义广播接收器:

      自定义广播接收器的方法很简单,我们只需要创建一个自定义类继承BroadcastReceiver,并实现onReceive()方法

public class MyBroadcastReceiver extends BroadcastReceiver {//需要实现的方法
    @Overridepublic void onReceive(Context context, Intent intent) {}
}

      onReceive()方法就是当广播接收器接收到广播后会执行的方法,我们可以看到它会接收到一个Intent,这个Intent就是发送广播时传过来的Intent对象,我们可以在onReceive()中获取Intent传来的额外数据,并进行处理。

2.注册广播接收器

      创建了自己的广播接收器后,我们就可以在需要接收广播的地方进行注册。注册广播的方式有两种:静态注册和动态注册。

      静态注册广播需要我们在AndroidManifest中去注册广播接收器,它的特点是该广播接收器一旦注册后将会一直存在,并且监听广播,即使我们退出了应用,广播接收器仍然可以接收广播,并触发onReceive()方法。静态广播的使用也比较广泛,比如一个公司里有多个App产品,通过静态注册的广播接收器,就能够实现一个App启动其他的App。

    <application>   ...<receiver android:name=".widget.MyBroadcastReceiver"><intent-filter><action android:name="com.weimore.example.MY_BROADCAST"/></intent-filter></receiver>...<application/>

      如上,我们注册广播接收器,首先指定是哪一个广播接收器,在receiver标签写上我们之前自定义的广播接收器的类名即可。然后在里面添加一个intent-filter(过滤器)用来过滤广播,intent-filter里的action指定了我们所要接收的广播,如果对intent-filter不了解的,可以去看看我写的关于intent的一篇博客。当其他地方发出广播时,我们会对比其传递的intent中的action,如果intent中的action与注册广播接收器时intent-filter中指定的action一致,则接收此广播,这样就起到了广播过滤的作用。

      动态注册广播和静态注册一样,需要知道使用的广播接收器,以及需要一个Intent-filter用来过滤广播,Intent-filter中同样需要传入一个action,用来指定要接收的广播,最后使用registerReceiver()注册广播即可。代码如下:

   //自定义的广播接收器
MyBroadcastReceiver mReceiver = new MyBroadcastReceiver();//过滤器,其中传入一个action
IntentFilter filter
= new IntentFilter("com.weimore.example.MY_BROADCAST");//注册广播
registerReceiver(mReceiver,filter);

       解注册广播:

   //解注册
unregisterReceiver(mReceiver);

      我们用Activity动态注册和解注册BraodcastReceiver时,最好在onResume()方法和onPause()方法中进行注册和解注册。因为不处于交互状态的Activity本来就没有必要去接受和处理广播。

      这样广播接收器就算是注册完成了,接下来只要等待其他应用或组件发送广播。然后进行接收就可以了。发送广播的方法也很简单,通过调用sendBroadcast()方法,并传入一个 intent 即可。

  //创建Intent对象Intent intent = new Intent();//指定actionintent.setAction("com.weimore.example.MY_BROADCAST");//发送广播sendBroadcast(intent);

      广播发送后,我们注册的广播接收器就能接收到广播,并调用接收器中的onReceive()方法,整个广播的发送与接收流程也就完成了。要注意的是,静态注册广播接收器的特点是即使应用销毁后也会接收广播,而动态注册广播接收器则相反,它的生命周期十分短暂,大概在10秒左右。每次当有匹配的广播发送过来时,它会创建BroadcastReceiver,并执行里面的onReceive()方法,然后10秒左右就会被销毁,所以我们在onReceive()方法种尽量不要进行太长的耗时操作。此外,我们也最好不要再BroadcastReceiver中创建子线程进行耗时操作,因为BroadcastReceiver在执行onReceive()结束任务后,它的进程优先级会处于空进程的优先级,随时随地会被系统给回收销毁,而依赖于该进程的子线程也会随即被销毁。所以最好的处理方法是在onReceive()中启动Service,将耗时操作交给Service去处理。

 

其他的Broadcast

      上面所介绍的广播属于标准广播,该种广播一旦发送,只要是action能够匹配的BroadcastReceiver都能够接收到广播。除了该类型的广播之外,我们还能够发送有序广播,本地广播等。

      有序广播是指当广播发送后,会根据广播接收器的优先级进行顺序传递。比如有两个广播接收器都能够匹配该广播,但一个的优先级为100,而另外一个的优先级为50,则广播为先传递到优先级高的那个广播接收器,该广播接收器接收到广播后,可以对广播进行拦截,这样后面的广播接收器就无法接收到该广播了,如果不做拦截,则会继续按优先级大小发送广播。

      有序广播的使用也很简单,将之前的sendBroadcast()方法变为sendOrderedBroadcast()就可以了。

//第二个参数表示接收器接收该广播所需要的权限,一般传null即可
sendOrderedBroadcast(intent,null);

      设置广播接收器的优先级主要是在Intent-filter中设置的。静态注册和动态注册给广播接收器设置优先级的方法分别如下:

   //静态注册
<receiver android:name=".widget.MyBroadcastReceiver"><intent-filter android:priority="100"> //设置优先级<action android:name="com.weimore.example.MY_BROADCAST"/></intent-filter></receiver>
   //动态注册   
IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");filter.setPriority(100);

      如果某个广播接收器想要拦截该广播,只需要在onReceive()方法中调用abortBroadcast()方法就可以了。

@Overridepublic void onReceive(Context context, Intent intent) {//拦截广播
        abortBroadcast();}

     

      本地广播和标准广播以及有序广播有些许不同,它是使用LocalBroadcastManager来发送广播以及注册广播接收器的。本地广播的优点是它发出的广播只会在应用程序的内部传播,不用担心广播被其他应用接收,造成数据泄漏,而广播接收器也只能接收到自己应用发出的广播,不会接收别的应用发来的广播,防止接收垃圾信息。具体使用如下:

    //得到LocalBroadcastManager实例LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);mReceiver = new MyBroadcastReceiver();IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");//注册广播接收器manager.registerReceiver(mReceiver,filter);
    //得到LocalBroadcastManager实例LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);Intent intent = new Intent();intent.setAction("com.weimore.example.MY_BROADCAST");//发送本地广播manager.sendBroadcast(intent);

      

 

转载于:https://www.cnblogs.com/weimore/p/7858640.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库索引页号为什么从3开始_MySQL数据库快问快答

原标题&#xff1a;MySQL数据库快问快答前言今天楼主给大家列一下关于数据库几个常见问题的要点&#xff0c;如果大家对其中的问题感兴趣&#xff0c;可以自行扩展研究。1. UNION ALL 与 UNION 的区别UNION和UNION ALL关键字都是将两个结果集合并为一个。UNION在进行表链接后会…

通过简单的Spring方面摆脱null参数

什么是世界上最令人讨厌的&#xff0c;同时也是最受欢迎的例外&#xff1f; 我敢打赌这是NullPointerException。 NullPointerException可以表示任何东西&#xff0c;从简单的“ ups&#xff0c;我认为不能为空”到数小时和数天的第三方库调试&#xff08;我敢于尝试使用Doze…

java arraylist排序_最全Java集合笔记

集合概述什么是集合集合框架&#xff1a;用于存储数据的容器。集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容&#xff1a;对外的接口、接口的实现和对集合运算的算法。接口&#xff1a;表示集合的抽象数据类型。接口允许我们操作…

【3】JVM-OutOfMemory异常重现

JVM中常见的OOM&#xff0c;那么如何通过自己编写代码产生这些OOM异常呢&#xff1f;通过写代码重现异常&#xff0c;是为了避免在工作中写出有OOM BUG的代码。之前虽然看过相关文章&#xff0c;但是没自己写过这些代码&#xff0c;这次在编写的实际过程中&#xff0c;由于和书…

CachedIntrospectionResults 初始化

转载于:https://www.cnblogs.com/xiluhua/p/7862985.html

为什么有些内联(行内)元素可以设置宽高?

为什么有些内联&#xff08;行内&#xff09;元素如img、input可以设置宽高&#xff1f; 在说明之前我们先来了解一些定义。 块级元素和内联元素&#xff1a; ①块级元素总是独占一行&#xff0c;表现为另起一行开始&#xff0c;而且其后的元素也必须另起一行显示。 宽度(w…

mongo数据库和mysql数据库的区别_Mongodb与mysql数据库的区别

MySQLMongoDB说明mysqldmongod服务器守护进程mysqlmongo客户端工具mysqldumpmongodump逻辑备份工具mysqlmongorestore逻辑恢复工具db.repairDatabase()修复数据库mysqldumpmongoexport数据导出工具sourcemongoimport数据导入工具grant * privileges on *.* to …Db.addUser()Db…

在Eclipse中高效运行HTTP / REST集成测试

最近&#xff0c;我有机会使用由我亲爱的Holger Staudacher编写的OSGi-JAX-RS-Connector库。 通过连接器&#xff0c;您可以通过将Path注释的类型注册为OSGi服务来轻松发布资源-实际上&#xff0c;它工作得很好。 对于我来说&#xff0c;使用普通的JUnit测试编写驱动的服务类测…

Eclipse安装TestNG插件

Eclipse安装TestNG插件 TestNG是什么? TestNG按照其文档的定义是&#xff1a; TestNG是一个测试框架&#xff0c;其灵感来自JUnit和NUnit的&#xff0c;但引入了一些新的功能&#xff0c;使其功能更强大&#xff0c;使用更方便。 TestNG是一个开源自动化测试框架;TestNG表示下…

basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解

Java基础-DBCP连接池(BasicDataSource类)详解作者&#xff1a;尹正杰版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程&#xff0c;为了解决此类性能问题&#xff0c;通常…

生物神经网络衍生出的算法

一个生物神经网络的基本结构&#xff1a; 生物神经网络由大量神经元组成&#xff0c;这些神经元之间通过突触相互连接。神经元可以接收来自其他神经元的信号&#xff0c;并根据信号的强度和类型来调整自己的输出信号。这种神经元之间的相互连接和信号传递形成了生物神经网络的基…

echart实例数据 本地加载_JVM 类加载概述

来源&#xff1a;SegmentFault 思否社区作者&#xff1a;又坏又迷人JVM简介JVM是Java Virtual Machine(Java虚拟机)的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Ja…

JPA / Hibernate:基于版本的乐观并发控制

本文是Hibernate和JPA中基于版本的乐观并发控制的简介。 这个概念已经很老了&#xff0c;上面已经写了很多东西&#xff0c;但是无论如何我都看到了它被重新发明&#xff0c;误解和滥用。 我在编写它只是为了传播知识&#xff0c;并希望引起人们对并发控制和锁定的兴趣。 用例…

高可用集群搭建

高可用集群搭建  创建hadoop账户 创建hadoop账户&#xff08;#注意&#xff0c;接下来的操作均在hadoop账户下运行&#xff09; # useradd hadoop # passwd hadoopsu - hadoopmkdir soft disk1 disk2mkdir -p disk{1,2}/dfs/{dn,nn}mkdir -p disk{1,2}/nodemgr/local 将本地目…

scrt如何切换成英文版_英文版SecureCRT显示乱码解决

英文版SecureCRT显示乱码解决系统环境&#xff1a;CentOS&#xff15;.&#xff16;以前Linux都是默认安装在英文环境下&#xff0c;用英文版的SecureCRT查看系统内容输出的也都是英文的&#xff0c;不会出现乱码问题。今天同事在服务器安装时默认选择了简体中文&#xff0c;这…

java try catch_Java捕获异常

大家好&#xff0c;欢迎来到乐字节小乐的Java技术分享园地在Java中&#xff0c;凡是可能抛出异常的语句&#xff0c;都可以用try ... catch捕获。把可能发生异常的语句放在try { ... }中&#xff0c;然后使用catch捕获对应的Exception及其子类。多catch语句可以使用多个catch语…

haproxy文件操作

import os #导入os模块def search(): #定义查找函数 with open(haproxy.txt,r) as f: #只读方式打开文件 value input(请输入您…

多语言持久性:带有MongoDB和Derby的EclipseLink

从现在开始&#xff0c;多语种持久性一直是新闻。 从2011年底开始&#xff0c;在著名的Fowler帖子的推动下&#xff0c;我看到了更多更好的主意。 最新的一个是公司内部的学生项目&#xff0c;我们在其中使用Scala作为后端数据&#xff0c;将数据持久存储到MongoDB&#xff0c;…

web前端开发最佳实践--(笔记之JavaScript最佳实践)

如何避免全局变量污染&#xff1f; 避免定义全局变量或全局函数用一个变量进行封装&#xff0c;并返回外部需要访问的接口如何写出高维护的js代码 配置数据和代码逻辑分离 如&#xff1a; 改成&#xff1a; ---用js模板mustachehandlebarsjsMVC的数据模式 model&#xff1a;数据…

yum mysql5.7位置_CentOS yum 安装 Mysql5.7

1 Steps for a Fresh Installation of MySQL# wget https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm# yum localinstall mysql57-community-release-el6-9.noarch.rpm以上步骤其实是把 MySQL Yum repository 添加到了系统的 repository list 里去了。ll…