上面提到,当系统以一个Intent的形式发送一个Broadcast出去之后,所有与之匹配的BroadcastReceiver都会被实例 化,但是这里是有区别的,根据Broadcast的传播方式区别,在系统中有如下两种Broadcast:
- 1.普通广播:Normal Broadcase,它是完全异步的,也就是说,在逻辑上,当一个Broadcast被发出之后,所有的与之匹配的BroadcastReceiver都 同时接收到Broadcast。优点是传递效率比较高,但是也有缺点,就是一个BroadcastReceiver不能影响其他响应这条 Broadcast的BroadcastReceiver。
- 2.有序广播:Ordered Broadcast,它是同步执行的,也就是说有序广播的接收器将会按照预先声明的优先级依次接受Broadcast,是链式结构,优先级越高 (-1000~1000),越先被执行。因为是顺序执行,所有优先级高的接收器,可以把执行结果传入下一个接收器中,也可以终止Broadcast的传播 (通过abortBroadcast()方法),一旦Broadcast的传播被终止,优先级低于它的接收器就不会再接收到这条Broadcast了。
虽然系统存在两种类型的Broadcast,但是一般系统发送出来的Broadcast均是有序广播,所以可以通过优先级的控制,在系统内置的 程序响应前,对Broadcast提前进行响应。这就是市场上一些拦截器类(如:短信拦截器、电话拦截器)的软件的原理。
如何发送一个广播
(正文)
上面已经介绍了系统中两种不同的Broadcast,而根据Broadcast传播的方式,Context提供了不同的方法来发布它们:
- 1.sendBroadcast():发送普通广播。
- 2.sendOrderedBroadcast():发送有序广播。
以上两个方法都有多个重载方法,根据不同的场景使用,最简单的莫过于直接传递一个Intent来发送一个广播。
如何使用BroadcastReceiver
BroadcastReceiver本质上还是一个监听器,所以使用BroadcastReceiver的方法也是非常简单,只需要继承 BroadcastReceiver,在其中重写onReceive(Context context,Intent intent)即可。一旦实现了BroadcastReceiver,并部署到系统中后,就可以在系统的任何位置,通过sendBroadcast、 sendOrderedBroadcast方法发送Broadcast给这个BroadcastReceiver。
但是仅仅继承BroadcastReceiver和实现onReceive()方法是不够的,同为Android系统组件,它也必须在 Android系统中注册,注册一个BroadcastReceiver有两种方式:
- 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,但是一般在实际开发中,还是会使用清单文件进行注册:
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;23 import android.content.BroadcastReceiver;4 import android.content.Context;6 import android.widget.Toast;5 import android.content.Intent;710 @Override8 public class BasicBroadcast extends BroadcastReceiver {912 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;23 import android.content.BroadcastReceiver;4 import android.content.Context;6 import android.widget.Toast;5 import android.content.Intent;78 public class BasicBroadcast extends BroadcastReceiver {910 @Override11 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;23 import com.bgxt.datatimepickerdemo.R;45 import android.app.Activity;6 import android.content.Intent;7 import android.os.Bundle;8 import android.view.View;9 import android.widget.Button;1011 public class BasicActivity extends Activity {12 Button btnBasicSendNormal, btnBasicSendOrdered;1314 @Override15 protected void onCreate(Bundle savedInstanceState) {16 super.onCreate(savedInstanceState);17 setContentView(R.layout.activity_basic);1819 btnBasicSendNormal = (Button) findViewById(R.id.btnBasicSendNormal);20 btnBasicSendOrdered = (Button) findViewById(R.id.btnBasicSendOrdered);21 btnBasicSendNormal.setOnClickListener(new View.OnClickListener() {2223 @Override24 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 });3132 btnBasicSendOrdered.setOnClickListener(new View.OnClickListener() {3334 @Override35 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 }