广播接收者BroadcastReceiver用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast(),Context.sendOrderedBroadcast()来实现的。
一个广播可以被多个订阅了此广播的接收者接收。要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver{
public void onReceive(Context context,Intent intent){}
}
第二布:订阅感兴趣的广播Intent,方法有二
1.使用代码进行订阅
IntentFilter filter = new IntentFilter(“android.provider.Telephony.SMS_RECEIVED”);
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver,filter);
2.在Manifest.xml文件中的<application>节点里进行订阅
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
广播类型:
普通广播:异步,(逻辑上)同一时刻被所有接收者接收,相对传递效率高;
然而接收者不能将处理结果传递给下一个接收者,并且无法终止广播的传递
有序广播:按照接收者声明的优先级别依次接收。
优先级别取值范围-1000---1000,在<intent-filter>的android:priority属性中声明,也可以调用IntentFilter对象的setPriority()进行设置。数值大则级别高。例如 A取300 ,B取200,C取100,则优先级A>B>C,广播先传给A,再给B,再给C;
有序广播可以终止广播的传播,例如A接到后终止了广播,则B和C就无法收到广播;
有序广播的接收者可以将数据传递给下一个接收者,如:A得到广播后,可以往他的结果对象中存入数据,当广播传给B时,B可以从A的结果对象中得到A存入的数据。
Context.sendBroadcast()发送普通广播
Context.sendOrderedBroadcast()发送有序广播
BroadcastReceiver.abortBroadcast()优先级高的终止广播,后面的接收者就再也无法获得广播
setResultExtras(Bundle)存放结果对象,然后传递给下一个接收者
下一个接收者通过:Bundle bundle = getResultExtras(true)可以获取上一个接收者存入在结果对象中的数据。
系统接收到短信,发出的广播属于有序广播,如果想阻止用户收到短信可以通过设置优先级,让自定义的接收者先获取到广播,然后终止广播,这样用户就接不到了。
发送有序广播:
Intent broadcastIntent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER, “13671200900”);
第一个参数为广播对象
第二个参数为接收该广播的权限
第三个参数为必须接收该广播的接收者,如果该广播不是一定要被某个接收者接收,该参数可以设置为null
第四个参数为Hanndle,如果为null,接收者将在Context所在的主线程被调用
第五个参数为用于标识结果数据的结果码
第六个参数为结果数据
第七个参数为附加到广播的额外数据
sendOrderedBroadcast(broadcastIntent, "android.permission.PROCESS_OUTGOING_CALLS", new OutgoingCallReceiver(), null, Activity.RESULT_OK, number, n