我在学习Broadcast时看到网页上很多人把Broadcast分为静态注册和动态注册两种形式,就我个人理解,静态注册和动态注册应该是BroadcastReceiver的两种注册形式,而不是广播的两种形式,网上很多讲Broadcast的博客没有讲到OrderedBroadcast,可能是他们认为OrderedBroadcast跟Broadcast是两个不同的东西,我也就不深究了,在这里我想把它们放在一起讲。
sendBroadcast(intent);//发送普通广播
我把OrderedBroadcast叫做有序广播,Broadcast叫做普通广播,他们的区别是有序广播发出后能够适配的广播接收者按照一定的权限顺序接收这个广播,并且前面的接收者可以对广播的内容进行修改,修改的结果被后面接收者接收,优先级高的接收者还可以结束这个广播,那么后面优先级低的接收者就接收不到这个广播了。而普通广播发出后,能够是适配的接收者没有一定顺序接收广播,也不能终止广播。
我再详细讲讲
OrderedBroadcast。举个例子,假如android系统现在收到一条短信息,那么它会发送一个有序广播,其action 是
android.provider.Telephony.SMS_RECEIVED
,android手机中有个短信息的程序,它能够接收到这个广播。假如我现在写个应用程序,也去接收这广播,并且我的优先级大于系统中SMS应用程序的优先级,那么我们的程序可以先与系统中SMS应用程序接收到短消息,并且能够决定是不是要让SMS应用程序接收到这个短消息广播,也可以改变短消息的内容,在交给第优先级的应用程序。像360垃圾短信拦截功能就是这样做的。将在第三节实现这个例子,做一个短信息的拦截器。
广播的发送比较简单,第一节讲了Intent,构造一个隐式的Intent,然后用
public void
sendBroadcast
(Intent intent)
这两个API以及他么的重载方法去发送一个广播。发送
OrderedBroadcast时可以指定一个必须接受到这个广播的广播接收者,如果设为null,那么则不指定必须接收这个广播的接收者。
下面是一个简单的发送广播的demo
Button button = (Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setAction("qin.action.XXX");//设定动作
intent.addCategory("qin.category.android");//设定类型
// sendOrderedBroadcast(intent, null);//发送有序广播
}
});
这里通过点击button就可以发送一个普通广播了。
写到这里,我发现这里发一个广播和启动一个隐式的Intent非常像,那么它们之间有什么区别呢?我发上面这样一个广播能不能被上一节配有同样Activity所响应呢?这两个问题留给大家实践,我们在第四节做出解答。