广播接收者(BroadcastReceiver)
一、什么是广播:
当一个事件产生的时候,就会发出一个广播,所有注册了这个广播的接受者,都可以接收到这个广播。
二、定义广播接收者步骤:(短信的监听器:接收短信的到来时发出的广播,并获取短信的内容)
1、自定义一个类,继承BroadcastReceiver类。覆写onReceive方法
public class SmsReceiver extends BroadcastReceiver {
publicvoid onReceive(Context arg0, Intent data) {
System.out.println("短信到来了");
//pdus为短信的规范,获取短信的数组。
Object[] pdus = (Object[])data.getExtras().get("pdus");
for(Object pdu : pdus){
//获取每一条短信对象
SmsMessage smsmessage = SmsMessage.createFromPdu((byte[]) pdu);
//短信的内容:
Stringcontent = smsmessage.getMessageBody();
System.out.println(content);
if(content.contains("fapiao")){
abortBroadcast();
}
//获取短信的发件人
Stringsender = smsmessage.getOriginatingAddress();
System.out.println(sender);
if("5558".equals(sender)){
abortBroadcast();
//获取短信的管理者
SmsManager manager =SmsManager.getDefault();
//向发送者发短信
manager.sendTextMessage(sender, null,"ni qu siba ", null, null);
}
}
// 终止掉这条广播事件
}
2、在AndroidManifest.xml清单文件中使用receiver 元素配置广播接收者:
package="cn.itcast.listener"
android:versionCode="1"
android:versionName="1.0" >
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
//配置广播接收者
//广播接收者的意图过滤器。
//接收短信的动作
android:name="android.provider.Telephony.SMS_RECEIVED"/>
3、注意:想要广播接收者接收不同的事件发出的官博,就在清单文件中广播接收者的意图过滤器中配置相应的事件。
//配置广播接收者
//广播接收者的意图过滤器。
//指定广播优先级
//接收短信的动作
android:name="android.provider.Telephony.SMS_RECEIVED"/>
4、系统的广播事件分为两种类型:
有序广播:按顺序下达的广播,可以指定广播接收者的优先级。
优先级从-1000到1000,1000代表优先级最大。当广播到来时,按广播接收者的优先级高低传播。如果在高优先级的广播接收者中调用abortBroadcast()终止掉这条广播事件。则该广播就不会向优先级低的广播接收者传播。
例:拦截垃圾短信。
无序广播:广播接收者,同时接收这个广播。
三、案例:为拨打的号码增加IP号:
1、定义类:
public class OutGoingCallReceiver extendsBroadcastReceiver {
@Override
publicvoid onReceive(Context context, Intent arg1) {
//IP号
String ipnumber = "17951";
String number = getResultData(); //获取拨打的号码
System.out.println("当前的电话号码为"+number);
//把ip号码添加到 要拨打的号码的前面
String newnumber = ipnumber+number;
setResultData(newnumber);//设置拨打的号码
}
}
2、在清单文件中注册广播接收者:指定接收者的接收的事件和优先级:
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
android:name="android.intent.action.NEW_OUTGOING_CALL"/>
-->
3、在清单文件中配置拨打电话的权限:
android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
四、在代码中动态注册广播接收者:
在activity类中
//创建广播接收者
OutGoingCallReceiver receiver = newOutGoingCallReceiver();
//创建意图过滤器
IntentFilter filter = new IntentFilter();
filter.setPriority(1000);//设置优先级
//设置意图
filter.addAction("android.intent.action.NEW_OUTGOING_CALL");
//注册广播接收者
registerReceiver(receiver, filter);
五、广播接收者的生命周期:
如果广播接收者响应超过10秒,会导致主线程无响应。报出anr异常。