Broadcast Receiver

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。

按照优先级一级一级的向下传递,高优先级的广播接收者可以拦截广播,可以修改广播数据,也可以终止广播事件。


优先级相同的情况下,在清单文件中位置靠前的优先级高。如果是不同的应用程序的优先级相同,谁先安装谁优先级高。

公司做开发一般都是无序广播。

    原文作者:张永飞
    原文地址: https://blog.csdn.net/zhangyongfeiyong/article/details/38563605
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞