Android开发22——广播接收者BroadcastReceiver的原理和注册方式
一、广播机制的基本概念
当某个事件产生时(如一条短信发来或一个电话打来),android操作系统会把这个事件广播给所有注册的广播接收者,需要处理这个事件的广播接收者进行处理。其实这就是日常生活中的广播。发生一个新闻后,广播电台会广播这个新闻给打开收音机的人,对这个新闻感兴趣的人会关注,可能会拿笔记下。新闻就是事件,广播电台就是android系统,打开收音机的人就是广播接收者,感兴趣的人就是需要处理该事件的广播接收者,拿笔记下就是对该事件进行的操作。
二、广播的分类——普通广播和有序广播
①普通广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。
②有序广播:按照被接收者的优先级顺序,在被接收者中一次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权中终止广播,比如B终止广播,C就无法接收到。此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中取得A存入的数据。如系统收到短信发出的广播就是有序广播。
三、注册广播接收者的两种方式
①在AndroidManifest.xml中注册
在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。下面的例子1、2广播接收者会接收到拨打电话的广播。
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 广播接收者1--> <receiver android:name=".BroadcastReceiver1"> <intent-filter> <action android:name="android.intent.action.CALL"></action> </intent-filter> </receiver> <!-- 广播接收者2 --> <receiver android:name=".BroadcastReceiver2"> <intent-filter> <action android:name="android.intent.action.CALL"></action> </intent-filter> </receiver> <!-- 广播接收者3 --> <receiver android:name=".BroadcastReceiver3"> <intent-filter> <action android:name="android.intent.action.PICK"></action> </intent-filter> </receiver> </application>
/** * 模拟拨打电话广播 * * @author 徐越 * */public class MainActivity extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = new Intent(); intent.setAction("android.intent.action.CALL"); this.sendBroadcast(intent); }}/** * 每次接收广播都会生成新的BroadcastReceiver1,当处理完onReceive方法后就不会再被使用 * 再次接收就在生成新的BroadcastReceiver1对象 * * @author 徐越 * */public class BroadcastReceiver1 extends android.content.BroadcastReceiver{ public BroadcastReceiver1() { Log.i("xy_Receiver", "construtor1"); } @Override public void onReceive(Context context, Intent intent) { Log.i("xy_Receiver", "onReceive1"); }}/** * 广播接收者2 * * @author 徐越 * */public class BroadcastReceiver2 extends android.content.BroadcastReceiver{ public BroadcastReceiver2() { Log.i("xy_Receiver", "construtor2"); } @Override public void onReceive(Context context, Intent intent) { Log.i("xy_Receiver", "onReceive2"); }}/** * 广播接收者3 * * @author 徐越 * */public class BroadcastReceiver3 extends android.content.BroadcastReceiver{ public BroadcastReceiver3() { Log.i("xy_Receiver", "construtor3"); } @Override public void onReceive(Context context, Intent intent) { Log.i("xy_Receiver", "onReceive3"); }}
②在Activity中注册
在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity中注册。
/** * Activity中注册广播接收者 * * @author 徐越 * */public class MainActivity extends Activity{ private BroadcastReceiver receiver; private static final String CALL_ACTION = "android.intent.action.CALL"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } /** * 模拟发送一个电话的广播 * * @param v */ public void sendBroadCast(View v) { Intent intent = new Intent(); intent.setAction("android.intent.action.CALL"); this.sendBroadcast(intent); } public void bindReceiver(View v) { receiver = new BroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(CALL_ACTION); this.registerReceiver(receiver, intentFilter); } public void unBindReceiver(View v) { this.unregisterReceiver(receiver); }}public class BroadcastReceiver extends android.content.BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Log.i("xy", "receiver"); }}
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow
Android开发22——广播接收者BroadcastReceiver的原理和注册方式相关推荐
- 广播接收者BroadcastReceiver
Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方 ...
- Android开发中怎样调用系统Email发送邮件(多种调用方式)
在Android中调用其他程序进行相关处理,几乎都是使用的Intent,所以,Email也不例外,所谓的调用Email,只是说Email可以接收Intent并做这些事情 我们都知道,在Android中 ...
- android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...
在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23 作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...
- Android中广播接收者BroadcastReceiver详解
1. 接收系统的广播步骤 (1) 新建一个类继承BroadcastReceiver 以监听sd卡状态的广播接收者为例 1 public class SdCardBroadcastReceiver e ...
- Android复习12【广播接收者-BroadcastReceiver(简单案例-发送广播、静态注册、动态注册、本地广播、代码示例(别处登陆踢用户下线)、常用系统广播总结、音乐播放器)】
2020-04-28[11周-周二] 音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目 录 简单案例-发送广播 2)动态注册实例(监听网 ...
- Android开发之广播
广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化.信号的强弱状态.电话的接听和短信的接收等等,现在给大家简单介绍一下系统发送.监听这些广播的机制. ...
- 在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?
在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常. 那么,开发中,有哪些措施能避免这个问题呢?不仅仅是Bitmap的处理,其他方面也会导致OOM.有哪些 ...
- Android开发学习—指纹识别系统的原理与使用
指纹识别是什么? 提到指纹识别我们就要先弄清楚什么事指纹,指纹为何能够做到区别性. 指纹,由于其具有终身不变性.唯一性和方便性,已几乎成为生物特征识别的代名词.指纹是指人的手指末端正面皮肤上凸凹不平产 ...
- Android开发如何高效学习系统底层原理
本文首发于微信公众号「刘望舒」 大家好,我是刘望舒,I'm back!最近分享了一些视频,都属于望舒杂谈,望舒杂谈会分享一些经验,什么都会聊.除了望舒杂谈还有另一个视频分支叫做BATcoder,什么是 ...
- Android面试,BroadCastReceiver的两种注册方式的异同
在Android手机应用程序中开发中,需要用到BroadcastReceiver来监听广播的消息.在自定义好BroadcastReceiver ,需要对其进行注册,注册有两种方法: 一种是在代码当中注 ...
最新文章
- tf.where() 详解
- 科普:目标检测Anchor是什么?怎么科学设置?[附代码]
- 关于function和Object的认识
- Nginx的几个常用配置和技巧
- install scrapy with pip and easy_install
- 二:unittest框架配合selenium之xpath定位
- 【数据库系统】文件处理系统和DBMS的主要区别
- 一半的一半(51Nod-2382)
- 计算机视觉论文-2021-06-28
- php 中文手册下载
- react native 更改app名称和图标
- Markdown - 如何给文本加下划线
- 华硕fl5600l笔记本拆机,在光驱位加装固态硬盘
- 如何在C#中将 加载、编辑WPS表格?国产控件就能搞定
- 5Gwifi和手机5G区别
- 《看聊天记录都学不会C语言?太菜了吧》(6)编程很难吗?差一点就学不会了呢!
- 介绍Jackson JsonNode和ObjectNode(*)
- 看了这篇,你也是Python文件操作高手
- 在Google Play发布应用显示设备数量为0,处理办法
- 手把手教您搞定用户画像(战略解读|建模体系|维度分解|应用流程)