Android广播接收 BroadcastReceiver监听系统全局的Broadcast消息

转载地址:http://www.android100.org/html/201312/04/4890.html
什么是BroadcastReceiver?

BroadcastReceiver,广播接收者,它是一个系统全局的监听器,用于监听系统全局的Broadcast消息,因此它能够很方便的 进行系统组件之间的通讯。
(了解的能够直接跳过)

1.BroadcastReceiver虽然是一个监听器,可是它和以前用到的OnXxxListener不一样,那些只是程序级别的监听器,运行在 指定程序的所在进程中,当程序退出的时候,OnXxxListener监听器也就随之关闭了,可是BroadcastReceiver属于系统级的监听 器,它拥有本身的进程,只要存在与之匹配的Broadcast被以Intent的形式发送出来,BroadcastReceiver就会被激活。

  2.虽然同属Android的四大组件,BroadcastReceiver也有本身独立的声明周期,可是和Activity、Service又不 同。当在系统注册一个BroadcastReceiver以后,每次系统以一个Intent的形式发布Broadcast的时候,系统都会建立与之对应的 BroadcastReceiver广播接收者实例,并自动触发它的onReceive()方法,当onReceive()方法被执行完成之 后,BroadcastReceiver的实例就会被销毁。虽然它独自享用一个单独的进程,但也不是没有限制的,若是 BroadcastReceiver.onReceive()方法不能在10秒内执行完成,Android系统就会认为该 BroadcastReceiver对象无响应,而后弹出ANR(Application No Response)对话框,因此不要在BroadcastReceiver.onReceive()方法内执行一些耗时的操做。

  3.若是须要根据广播内容完成一些耗时的操做,通常考虑经过Intent启动一个Service来完成该操做,而不该该在 BroadcastReceiver中开启一个新线程完成耗时的操做,由于BroadcastReceiver自己的生命周期很短,可能出现的状况是子线 程尚未结束,BroadcastReceiver就已经退出的状况,而若是BroadcastReceiver所在的进程结束了,该线程就会被标记为一 个空线程,根据Android的内存管理策略,在系统内存紧张的时候,会按照优先级,结束优先级低的线程,而空线程无异是优先级最低的,这样就可能致使 BroadcastReceiver启动的子线程不能执行完成。


BroadcastReceiver的种类

(了解的能够直接跳过)

上面提到,当系统以一个Intent的形式发送一个Broadcast出去以后,全部与之匹配的BroadcastReceiver都会被实例 化,可是这里是有区别的,根据Broadcast的传播方式区别,在系统中有以下两种Broadcast:html


  • 1.普通广播:Normal Broadcase,它是彻底异步的,也就是说,在逻辑上,当一个Broadcast被发出以后,全部的与之匹配的BroadcastReceiver都 同时接收到Broadcast。优势是传递效率比较高,可是也有缺点,就是一个BroadcastReceiver不能影响其余响应这条 Broadcast的BroadcastReceiver。

  • 2.有序广播:Ordered Broadcast,它是同步执行的,也就是说有序广播的接收器将会按照预先声明的优先级依次接受Broadcast,是链式结构,优先级越高 (-1000~1000),越先被执行。由于是顺序执行,全部优先级高的接收器,能够把执行结果传入下一个接收器中,也能够终止Broadcast的传播 (经过abortBroadcast()方法),一旦Broadcast的传播被终止,优先级低于它的接收器就不会再接收到这条Broadcast了。

  虽然系统存在两种类型的Broadcast,可是通常系统发送出来的Broadcast均是有序广播,因此能够经过优先级的控制,在系统内置的 程序响应前,对Broadcast提早进行响应。这就是市场上一些拦截器类(如:短信拦截器、电话拦截器)的软件的原理。 java


 如何发送一个广播android

(正文)
app


  上面已经介绍了系统中两种不一样的Broadcast,而根据Broadcast传播的方式,Context提供了不一样的方法来发布它们:异步


  • 1.sendBroadcast():发送普通广播。
  • 2.sendOrderedBroadcast():发送有序广播。

  以上两个方法都有多个重载方法,根据不一样的场景使用,最简单的莫过于直接传递一个Intent来发送一个广播。ide


 如何使用BroadcastReceiverspa


   BroadcastReceiver本质上仍是一个监听器,因此使用BroadcastReceiver的方法也是很是简单,只须要继承 BroadcastReceiver,在其中重写onReceive(Context context,Intent intent)便可。一旦实现了BroadcastReceiver,并部署到系统中后,就能够在系统的任何位置,经过sendBroadcast、 sendOrderedBroadcast方法发送Broadcast给这个BroadcastReceiver。线程


  可是仅仅继承BroadcastReceiver和实现onReceive()方法是不够的,同为Android系统组件,它也必须在 Android系统中注册,注册一个BroadcastReceiver有两种方式:orm


  • 1.在代码中使用Content.registerReceiver(BroadcastReceiver receiver, IntentFilter filter)进行注册,在使用完毕使用Content.unregisterReceiver(BroadcastReceiver receiver)方法进行注销。

  • 2.使用清单文件AndroidManifest.xml注册,在<application/>节点中,使 用<receiver/>节点注册,并用android:name属性中指定注册的BroadcastReceiver对象,通常还会通 过<Intent-filter/>指定<action/>和<category/>,并在<Intent- filter/>节点中经过android:priority属性设置BroadcastReceiver的优先级,在-1000~1000范围 内,数值越到优先级越高。

   虽然Android系统提供了两种方式注册BroadcastReceiver,可是通常在实际开发中,仍是会使用清单文件进行注册: xml

 
 
1 <receiver android:name="cn.bgxt.Broadcastdemo.Basic.BasicBroadcast">
2 <intent-filter android:priority="100">
3 <action android:name="cn.bgxt.Broadcastdemo.Basic.broadcast"/>
4 </intent-filter>
5 </receiver>

 
 
 
 

 下面经过一个简单的示例,讲解一下BroadcastReceiver的声明,以及如何向这个BroadcastReceiver发送消息。

首先先声明一个BroadcastReceiver,BasicBroadcast.java:

 
  
1 package cn.bgxt.Broadcastdemo.Basic;
2
3 import android.content.BroadcastReceiver;
4 import android.content.Context;
6 import android.widget.Toast;
5 import android.content.Intent;
7
10 @Override
8 public class BasicBroadcast extends BroadcastReceiver {
9
12 Toast.makeText(context,
11 public void onReceive(Context context, Intent intent) {
15 }
13 "接收到Broadcast,消息为:" + intent.getStringExtra("msg"),
14 Toast.LENGTH_SHORT).show();
16 }
  下面经过一个简单的示例,讲解一下BroadcastReceiver的声明,以及如何向这个BroadcastReceiver发送消息。 首先先声明一个BroadcastReceiver,BasicBroadcast.java:
 
  
1 package cn.bgxt.Broadcastdemo.Basic;
2
3 import android.content.BroadcastReceiver;
4 import android.content.Context;
6 import android.widget.Toast;
5 import android.content.Intent;
7
8 public class BasicBroadcast extends BroadcastReceiver {
9
10 @Override
11 public void onReceive(Context context, Intent intent) {
12 Toast.makeText(context,
13 "接收到Broadcast,消息为:" + intent.getStringExtra("msg"),
14 Toast.LENGTH_SHORT).show();
15 }
16 }
 
再声明一个Activity,用于发送Broadcast:BasicActivity.java:   
1 package cn.bgxt.Broadcastdemo.Basic;  
2  
3 import com.bgxt.datatimepickerdemo.R; 
4   
5 import android.app.Activity;  
6 import android.content.Intent; 
7 import android.os.Bundle;  
8 import android.view.View;  
9 import android.widget.Button; 
10  
11 public class BasicActivity extends Activity { 
12     Button btnBasicSendNormal, btnBasicSendOrdered; 
13  
14     @Override
15     protected void onCreate(Bundle savedInstanceState) { 
16         super.onCreate(savedInstanceState);
17         setContentView(R.layout.activity_basic);
18  
19         btnBasicSendNormal = (Button) findViewById(R.id.btnBasicSendNormal); 
20         btnBasicSendOrdered = (Button) findViewById(R.id.btnBasicSendOrdered);
21         btnBasicSendNormal.setOnClickListener(new View.OnClickListener() { 
22 
23             @Override 
24             public void onClick(View v) {
25                 Intent broadcast=new Intent();
26                 broadcast.setAction("cn.bgxt.Broadcastdemo.Basic.broadcast"); 
27                 broadcast.putExtra("msg", "这是一个普通广播"); 
28                 sendBroadcast(broadcast); 
29             } 
30         }); 
31  
32         btnBasicSendOrdered.setOnClickListener(new View.OnClickListener() { 
33 
34             @Override 
35             public void onClick(View v) { 
36                 Intent broadcast=new Intent();
37                 broadcast.setAction("cn.bgxt.Broadcastdemo.Basic.broadcast"); 
38                 broadcast.putExtra("msg", "这是一个有序广播");
39                 sendOrderedBroadcast(broadcast, null); 
40             } 
41         }); 
42     } 
43 }
Android:广播BroadcastReceiver 三联1