Android BroadcastReceiver 广播深入研究

Android深入探究笔记之二十
-- 广播接收者,BroadcastReceiver

1. 简单概述

广播被分为两种不同的类型:“普通广播(Normal broadcasts)、有序广播(Ordered broadcasts)、粘性消息".

普通广播是完全异步的,可以在同一时刻(逻辑上)被所有接收者接收到,消息传递的效率比较高。

但缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播。

有序广播是按照接收者声明的优先级别,被接收者依次接收广播。广播传输过程可以被终止,使用setResultExtras(Bundle),接受用Bundle
bundle = getResultExtras(true))获取上一个数据。

缺点是:容易被截取,面试纪要。

粘性消息在发送后就一直存在于系统的消息容器里面,等待对应的处理器去处理,如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态。

以下是调用方法:

Context.sendBroadcast()  --------普通消息发送方式

Context.sendOrderedBroadcast()--------有序广播发送方式

sendStickyBroadcast()--------有序广播发送方式

2.生命周期详解:

在Android中,每次广播消息到来时都会创建BroadcastReceiver实例并执行onReceive() 方法,

onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。

当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应。

所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出ANR(Application No Response)的对话框。

如果需要完成一项比较耗时的工作,应该通过发送Intent给Service,可以启动独立服务,或者启动activity来做长时间操作。

这里不能使用子线程来解决,因为 BroadcastReceiver 的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。

BroadcastReceiver一旦结束,此时BroadcastReceiver所在的进程很容易在系统需要内存时被优先杀死,

因为它属于空进程(没有任何活动组件的进程)。

如果它的宿主进程被杀死,那么正在工作的子线程也会被杀死。所以采用子线程来解决是不可靠的。

3.注册两种方式:

1:  静态注册是指将注册文件放入到配置文件中进行注册

实现过程:

①:继承BroadcastReceiver 并复习void onReceive(Context context, Intent intent)

②:将广播注册到manifest.xml中

[java] view
plain
copyprint?

  1. <receiver android:name="BroastRev">  // BroadcastReceiver  子类的名字(处理者)
  2. <intent-filter>
  3. <action android:name="com.pdw.activity.ACTION"></action> //对应的ACTION
  4. </intent-filter>
  5. </receiver>

③:发送广播

[java] view
plain
copyprint?

  1. <pre class="java" name="code">intent.setAction(ACTION);  //<span style="color:#ff0000;">对应配置文件中的ACTION = "com.pdw.activity.ACTION "</span>
  2. dBroadcast(intent);</pre><br>

机制分析:

当触发了sendBroadcast方法后系统会到manifest.xml中寻找与ACTION相对应的action ,找到后会去实例化里面对应的recevier也就是这里的BroastRev,然后执行里面的void onReceive(Context context, Intent intent)方法

2:动态注册是指在程序中注册广播

实现过程:

①:实例化一个IntentFilter 并注册如下

[java] view
plain
copyprint?

  1. receiver = new BroastRev();  //BroadcastReceiver 子类的名字(处理者)
  2. filter = new IntentFilter(); //实例化IntentFilter
  3. filter.addAction(ACTION);
  4. MainActivity.this.registerReceiver(receiver, filter); //注册

②:广播

[java] view
plain
copyprint?

  1. intent.setAction(ACTION);  //<span style="color:#ff0000;">对应IntentFilter 中的ACTION = "com.pdw.activity.ACTION "</span>
  2. sendBroadcast(intent);

③:解除注册

[java] view
plain
copyprint?

  1. MainActivity.this.unregisterReceiver(receiver);  //调用unregisterReceiver解除注册 这里的receiver 与注册的时候的是同一个对象

机制分析:动态注册会再程序上保持一个ACTION然后当发出广播的时候会在程序上搜索是否存在相对应的ACTION 如果存在则进入到广播子类中去!

3:优缺点分析

1、 在代码中用函数代码动态的方式注册。动态注册的处理器必须用代码动态的销毁,每次用来处理消息的就一个实例对象

2、 在配置文件里面静态注册,静态注册有个特点,那就是一旦注册就会一直存在于系统里面,无论应用是否关闭或开关机。(简直就是一个流氓软件病毒啊~)。静态注册每次有处理消息就由系统new一个处理器处理,并销毁

4:注意事项

动态绑定只是实现了绑定,所以还是要进行发送了广播才能进行接收。也就是说BroastRev 里面的onReceive方法才会接收到!

时间: 2024-11-08 16:37:32

Android BroadcastReceiver 广播深入研究的相关文章

Android——BroadcastReceiver 广播 短信拦截

/** * 如何去理解BroadcastReceiver(广播)?   * 其实可以这样想,首先我们要有一个发送广播的“媒体”,在这个例子中,我们暂且用activity组件作为这个媒体,当然以后 * 会用到service,或者随机启动方式来发送广播,这看业务需求来决定. * 在这个例子中,当点击按钮的时候,一条广播就发送了出去,同样用到了意图对象Intent. * 和启动activity和service一样,我们需要为意图对象设置“标记”和“包裹”,它就像个基站,向世界发送信号. * 而对于广播

Android 学习笔记 BroadcastReceiver广播...

PS:不断提升自己,是件好事... 学习内容: 1.BroadcastReceiver的使用.. 2.通过BroadcastReceiver去启动Service... 1.BroadcastReceiver...   广播接收者,用来接收系统和应用中的广播...Android广播机制用的地方还是很多的,比如说:当网络状态发生改变的时候,通过接收这条广播就能及时做出相应的响应,然后完成一些操作..这就是广播的机制...它自身并不实现图形用户界面...只是一个触发性的操作...   使用广播是需要几

Android中广播的发送BroadcastReceiver

之前在进行Android开发的过程中,由于某些原因,对android中广播的注册等相关知识进行了回顾及总结.也查看了相关源码及写demo验证.发现对广播的认识更深了一层.下面将所学进行记录,以备随时查看. 这些内容在网上也参考了他人的博客,相关链接如下: [1].基于源码分析的系统发送广播的流程:http://blog.csdn.net/zhangyongfeiyong/article/details/52022935 (很详细,推荐) [2].静态注册无法接收广播的问题:http://blog

BroadcastReceiver广播接收器基础

BroadcastReceiver 广播接收器 广播接收器,主要是用于app注册一些指定事件的广播接收器,系统在这些事件被触发的时候,会通知到注册的广播接收器,然后广播接收器在onReceive函数中对接收到的通知进行处理:广播接收器的两种注册方式:静态注册:<receiver android:name=".SMSBroadcastReceiver" > <intent-filter> <action android:name="android.

Android利用广播监听设备网络连接(断网)的变化情况

MainActivity如下: package cc.testnetworkchange; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 利用广播监听设备网络连接的变化情况 * 亦可借此监测到设备是否已经断开网络 */ public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedI

Android之广播(1)

(以下内容是阅读郭霖大神的<第一行代码>后自己总结的) 1.概述 广播是Android的四大组件之一. Android的广播机制十分灵活. 2.发送广播 如上图Android的广播主要分为两类:标准广播和有序广播. 所有的广播接收器都可以接收到标准广播,而且他们的接收几乎是在同一时刻.这意味着标准广播的效率很高,但无法被截断. 在接收有序广播时,广播接收器是由先后顺序的,优先级高的接收器先接收到广播,并且有权对该广播截断,不让后续接收器接收到. 发送标准广播和有序广播的方式非常简单. //发送

39.Android BroadcastReceiver

39.Android BroadcastReceiver Android BroadcastReceiver Android BroadcastReceiver 介绍 Android BroadcastReceiver 功能 Android BroadcastReceiver 浅淡机制 静态BroadcastReceiver 实现 动态BroadcastReceiver 实现 BroadcastReceiver 启动 Service Android BroadcastReceiver 介绍 现在

Android event logcat的研究

经常有这样的需求:在程序A启动之后,在这个程序上覆盖一个界面,让用户输入密码后才能启动程序A,这类场景主要集中在安全软件中. 那应该怎样得知某某程序启动了,系统没有相应的广播,这很难知道程序启动了. 既然没有通知,那我们就只能用最笨的方法:主动去询问最近启动过哪些程序. 这需要用后台服务器一直跑,每隔一段时间就询问一次.程序启动的时候,会在Logcat中打印出一些日志信息,其中就有类似下面的日志,表明是启动了哪个程序 01-21 15:09:56.957: I/ActivityManager(2

Android BroadcastReceiver基础详解一

-.BroadcastReceivcer概述 1.什么是广播 BroadcastReceiver是Android四大组件之一,本质是一种全局的监听器,用于监听系统全局的广播消息.因此它可以非常方便的实现不同组件之间的通信. 2.BroadcastReceiver的创建启动 BroadcastReceiver是用用于接受程序所放出的Broadcast Intent,与应用程序启动的Activity.Service相同.也只需要两步: ①.创建需要启动的Broadcast的Intent ②.创建一个