Broadcast Receiver 广播接收者
Android系统下的广播:
电池电量低
电池充电完毕
短信到来了
程序安装卸载
sd卡卸载安装
1.写一个类继承广播接收者。
2.广播接收者也是四大组件之一,也需要在清单文件中配置,同时配置关心的动作。如:
<span style="font-size:18px;"><!-- 配置广播接收者 -->
<receiver android:name="com.uc.ipcall.OutCallReceiver" >
<intent-filter>
<!-- 配置广播接收者关心的事件是外拨电话 -->
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver></span>
3.一旦广播事件发生,就会执行广播接收者的onReceive(Context context,Intent intent)方法。
获得广播的数据用:getResultData()方法,设置广播的数据用setResultData()方法。
广播接收者接收SD卡状态的变化时,除了配置action外,还要配置data里面的scheme=”file”这是固定写法。
<span style="font-size:18px;"><receiver android:name="com.uc.sdcard.sdstateReceiver" >
<intent-filter>
<action android:name="android.intent.action.MEDIA_UNMOUNTED" />
<data android:scheme="file" />
</intent-filter>
</receiver></span>
短信到来的广播接收者,Android4.4以后的版本都没有该功能了,是为了保护用户的隐私。
当系统收到短信时,会发出一个广播Intent,Intent的action名称为android.provider.Telephony.SMS_RECEIVED,该Intent存放了系统接收到的短信内容,我们使用名称”pdus”即可从Intent中获取短信内容。
<span style="font-size:18px;">public class IncomingSMSReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
SmsManager sms = SmsManager.getDefault();
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
for (SmsMessage message : messages){
String msg = message.getMessageBody();
String to = message.getOriginatingAddress();
sms.sendTextMessage(to, null, msg, null, null);
}}}}}</span>
终止广播在onReceive方法中调用abortBroadcast();方法。
广播接收者的优先级声明在intent-filter元素的android:priority属性中,范围是-1000到1000,默认是0,越大优先级越高。
自定义广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。发广播一般用的是隐式意图。
自定义广播时要先定义一个动作,如:intent.setAction(“com.uc.broadcastsender.help”);
接收自定义广播时,action的值与要接收广播的setAction中的值相同。
广播接收者的优先级
广播分为无序广播和有序广播。
无序广播:sendBroadcast(intent);
所有的接收者都会接收事件,不可以拦截,不可终止,不可以修改。
无序广播发送数据时可以用intent.putExtra(key,value);方法。
接收无序广播的数据时用intent.getStringExtra(key);方法。String可以是其他类型。
有序广播:
sendOrderBroadcast(intent,receiverPermission);
sendOrderBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras);
receiverPermission:目标接收者权限(可以为null)。
resultReceiver:最高领导指定的广播接收者,谁也拦截不了,高优先级也拦截不了(可以为null),但是可以修改。
scheduler:可以为null。
initialCode:初始码,作标记的,比如中央1号文件。可以为0.
initialData:广播的初始数据,最开始的数据。
initialExtras:广播里面的额外数据。可以为null。
按照优先级一级一级的向下传递,高优先级的广播接收者可以拦截广播,可以修改广播数据,也可以终止广播事件。
优先级相同的情况下,在清单文件中位置靠前的优先级高。如果是不同的应用程序的优先级相同,谁先安装谁优先级高。
公司做开发一般都是无序广播。