二、BroadcastReciver(广播接收者)

1、简述
  BroadcastReciver位于android.content包下,主要用于对广播消息(Intent)的过滤并响应的控件。可以理解为全局的监听器。
BroadcastReceiver 自身并不实现图形用户界面,但是当它收到某个广播消息后,BroadcastReceiver可以启动Activity作为响应,
或者启动Service服务等等。

2、运行原理
  当其他应用程序发出广播消息之后,所有注册了BroadcastReciver的应用程序将会检测注册时的(过滤器)IntentFilter是否与发出的广播消息相匹配,
匹配则会调用BroadcastReciver的onReceive()方法进行处理。所以开发BroadcastReciver应用,主要是对onReceive()方法的实现

3、生命周期
  生命周期不像Activity那么复杂,一般生命周期是:启动(被其他程序调用,接收到匹配的广播)-->运行(执行onReceive()方法)-->结束(释放资源)
每次广播到来时,会重新创建BroadcastReceiver对象 ,并且调用onReceive()方法,执行完以后,该对象即被销毁。当onReceive()方法在10秒内没有执行完毕,
Android会认为该程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出 ANR(Application NoResponse)的对话框。

4、广播的类型
  主要有以下两种类型:
  a、普通广播
  普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作,也无法将处理结果传递给下一个接收者。
  b、有序广播
  有序广播比较特殊,它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播,并且优先级高的广播可以传递消息给优先级底的广播。

5、广播的收发
  a、发送广播:构建Intent对象,可调用sendBroadcast(Intent)方法将广播发出。另外还有sendOrderedBroadcast(),sendStickyBroadcast()等方法
  b、接收广播:通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中响应事件

6、广播的注册
  创建完BroadcastReceiver之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址,否则无法接收广播
  一般有如下两种注册:
  a、静态注册

 <receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>

  b、动态注册

 MyReceiver receiver = new MyReceiver();

 IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST"); registerReceiver(receiver, filter);

  两种注册方法的区别是静态注册是常驻内存的,应用关闭是也可以接收广播,而动态注册是根着程序的生命周期,所以当这个程序退出时如果没有解除注册,系统会报一个异常,提示我们是否忘记解除注册。这时要加入解除注册的代码:

 @Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}

7、运行实例

写个例子,运行程序时发送广播,后台日志打印消息。

MyReceiver代码:

 public class MyReceiver extends BroadcastReceiver {

     private static final String TAG = "MyReceiver";

     @Override
public void onReceive(Context arg0, Intent intent) {
// TODO Auto-generated method stub
String msg = intent.getStringExtra("msg");
Log.i(TAG, msg);
} }

Activity发送广播代码:

      Intent intent = new Intent("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "Hello Receiver!");
sendBroadcast(intent);

直接用静态注册广播。上述例子的广播是我们自己写的。Android提供许多丰富的原生广播地址。常用如下:

  开机启动:<action android:name="android.intent.action.BOOT_COMPLETED"/>

  网络连接:<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>

  电量变化:<action android:name="android.intent.action.BATTERY_CHANGED"/>

  时间改变:<action android:name="android.intent.action.DATE_CHANGED"/>

只要更改自定义Receiver就可以触发一些相应事件。

android学习日记19--四大组件之BroadcastReciver(广播接收者)的更多相关文章

  1. android学习日记20--连接组件之Intent和IntentFilter

    上次刚了解完Android的四大组件,现在学习组件间通信的Intent和IntentFilter 一.Intent 1.简述 Intent(意图)在应用程序运行时连接两个不同组件,是一种运行时的绑定机 ...

  2. android学习日记19--四大组件之Services(服务)

    一个Android应用主要由四个基本组件组成,Android四大基本组件分别是Activity,Content Provider内容提供者,Service服务,BroadcastReceiver广播接 ...

  3. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...

  4. android学习日记03--常用控件Dialog

    常用控件 9.Dialog 我们经常会需要在Android界面上弹出一些对话框,比如询问用户或者让用户选择.这些功能我们叫它Android Dialog对话框 对话框,要创建对话框之前首先要创建Bui ...

  5. android学习日记03--常用控件button/imagebutton

    常用控件 控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者.方法则是控件的一些简单而可见的功能.所有控件都是继承View类 介绍android原生提供几种常用的控件bu ...

  6. android学习日记03--常用控件checkbox/radiobutton

    常用控件3.checkbox 复选框,确定是否勾选,点击一下勾选,点击第二下取消,当有一系列备选项时适合用checkbox控件,方便用户提交数据. 贴上例子Activity的java代码 packag ...

  7. Android基础整理之四大组件Activity

    最近准备系统的重新整理复习一下Android的各方面的知识,本着知识分享的原则,我就把梳理过程中一些东西给记录下来,权当一个学习笔记吧. 下面步入正题..... 什么是Activity Activit ...

  8. 【转】android学习日记01--综述

    转自:http://www.cnblogs.com/aiguozhe/p/3541941.html 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组 ...

  9. android学习日记01--综述

    开个博客,写点关于Android的知识,希望温故而知新吧! 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组成,分别是:Linux Kernel.A ...

随机推荐

  1. bzoj3205

    和bzoj2595类似,也是斯坦纳树 设f[l,r,]表示在点i机器人组合成了l-r最少推的次数,然后可得 f[l,r,i]=min(f[l,m,i]+f[m+1,r,i]) f[l,r,i]=min ...

  2. poj3274

    很不错的hash 优化有两个方面:1.根据题目换一个更优化的算法 2.在算法运行过程中优化 这题除了暴力好像没别的办法了吧? 但是暴力也是有策略的! 到第i只牛特征为j的总数为sum[i,j]; 找到 ...

  3. UVa 1606 (极角排序) Amphiphilic Carbon Molecules

    如果,没有紫书上的翻译的话,我觉得我可能读不懂这道题.=_=|| 题意: 平面上有n个点,不是白点就是黑点.现在要放一条直线,使得直线一侧的白点与另一侧的黑点加起来数目最多.直线上的点可以看作位于直线 ...

  4. UVa 1213 (01背包变形) Sum of Different Primes

    题意: 选择K个质数使它们的和为N,求总的方案数. 分析: 虽然知道推出来了转移方程, 但还是没把代码敲出来,可能基本功还是不够吧. d(i, j)表示i个素数的和为j的方案数,则 d(i, j) = ...

  5. bzoj1061: [Noi2008]志愿者招募

    线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...

  6. 自适应的CSS代码片段(常用)

    /* Smartphones (portrait and landscape) ----------- */ @media only screen and (min-device-width : 32 ...

  7. 常用高度——获取浏览器窗口的高度(jquery和js)

    一:针对浏览器的常用高度 jquery的用法: <script type="text/javascript"> $(document).ready(function() ...

  8. Struts2 教程

    一.Struts2是什么 Struts2是在WebWork2基础发展而来的.和Struts1一样, Struts2也是基于MVC的web层框架. 那么既然有了Struts1,为何还要Struts2? ...

  9. 求大于整数m且紧靠m的k个素数 及 判断一个数是否为素数的方法

    题目: 请编写一个函数void fun(int m,int k ,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中. 例如,若输入:17,5,则应输出:19,23 ...

  10. HDU4578 Transformation 线段树

    这个题让我重新学习了加 乘 在区间的操作 题解:http://blog.csdn.net/guognib/article/details/25324025?utm_source=tuicool& ...