BroadcastReceiver是Android四大组件之一。主要是用来接收广播事件。
1、广播的发送,主要有两种,有序广播和无序广播。
1.1 无序广播
sendBroadcast()方法发送的广播为无序广播。
无序广播可以被任何广播接受者接收到,优点是效率高。
发送一个广播,只要填写上广播对应的action,通过serBrocast()接口就可以实现了。
private final String BROCAST_ACTION = "com.android.brocast.START";
Intent intent = new Intent(BROCAST_ACTION);
try {
sendBroadcast(intent);
} catch (Exception e) {
Log.i(TAG, "send brocast fail!");
}
1.2 有序广播
sendOrderedBrocast()方法发送的广播为有序广播。
有序广播是依次传播,例如有多个广播接受者 A,B,C,优先级是A>B>C。此时发送的广播会先把A接收到,在传递给B,最后传递给C。
每个广播接收者都有权利终止广播,例如B终止了广播,那么后面广播接受者C就无法接收到该条广播了。
1.2.1 在AndroidManifest.xml配置三个receiver。
接受有序广播,需要增加对应的权限,所有我们增加对应的权限
<permission android:name="com.android.permission.RECEIVER_ORDER_BROADCAST" android:protectionLevel="normal" />
<uses-permission android:name="com.android.permission.RECEIVER_ORDER_BROADCAST" />
给每个receiver设置优先级,即设置android:priority=""的值,值越小优先级越高。
<receiver
android:name="com.android.brocast.FirstReceiver" >
<intent-filter>
<action android:name="com.android.orderbroadcast.START" android:priority="400" />
</intent-filter>
</receiver>
<receiver
android:name="com.android.brocast.SecondReceiver" >
<intent-filter>
<action android:name="com.android.orderbroadcast.START" android:priority="500" />
</intent-filter>
</receiver>
<receiver
android:name="com.android.brocast.ThirdReceiver" >
<intent-filter>
<action android:name="com.android.orderbroadcast.START" android:priority="600" />
</intent-filter>
</receiver>
1.2.2 分别实现对应的三个Receive
FirstRecveiver我们在第一个Receiver里面,增加一个bundle,通过setResultExtras()把数据传递下去。
package com.android.brocast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class FirstReceiver extends BroadcastReceiver {
private final String TAG = "FirstReceiver";
@Override
public void onReceive(Context content, Intent intent) {
if (intent == null) {
XLog.i(TAG, "intent is null");
return;
}
String action = intent.getAction();
XLog.i(TAG, "onReceive() action = " + action);
Bundle bundle = new Bundle();
bundle.putString("name", "FirstReceiver");
setResultExtras(bundle);
}
}
同时调用abortBroadcast()方法,停止广播的继续发送。
package com.android.brocast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
public class SecondReceiver extends BroadcastReceiver {
private final String TAG = "SecondReceiver";
@Override
public void onReceive(Context content, Intent intent) {
if (intent == null) {
XLog.i(TAG, "intent is null");
return;
}
String action = intent.getAction();
XLog.i(TAG, "onReceive() action = " + action);
Bundle bundle = getResultExtras(true);
String name = bundle.getString("name");
XLog.i(TAG, "name = " + name);
abortBroadcast();
}
}
在ThirdReceiver里面增加对应的log信息,用来验证是否可以接受到对应的广播。
package com.android.brocast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class ThirdReceiver extends BroadcastReceiver {
private final String TAG = "ThirdReceiver";
@Override
public void onReceive(Context content, Intent intent) {
if (intent == null) {
XLog.i(TAG, "intent is null");
return;
}
String action = intent.getAction();
XLog.i(TAG, "onReceive() action = " + action);
}
}
1.2.3 在应用里面发送一个有序的广播
这里面的权限和在androidmanifest要对应起来,不然接受者会接受不对广播。
private final String RECEIVER_PERMISSION = "com.android.permission.RECEIVER_ORDER_BROADCAST";
.....
Intent intent = new Intent(ORDER_BROADCAST_ACTION);
try {
XLog.i(TAG, "send order broadcast!");
sendOrderedBroadcast(intent, RECEIVER_PERMISSION);
} catch (Exception e) {
XLog.i(TAG, "send order brocast fail!");
}
1.2.4 当我们发送一个有序广播后,看下对应的输出log
03-23 11:57:13.631: V/bcDemo(7782): MainActivity onCreate()
03-23 11:57:13.631: V/bcDemo(7782): MainActivity onResume()
03-23 11:57:17.142: V/bcDemo(7782): MainActivity onClick()
03-23 11:57:17.142: V/bcDemo(7782): MainActivity send order broadcast!
03-23 11:57:17.148: V/bcDemo(7782): FirstReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:57:17.150: V/bcDemo(7782): SecondReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:57:17.150: V/bcDemo(7782): SecondReceiver name = FirstReceiver
可以看到优先级比较高的FrirstReceiver先收到广播,然后才是SecondReceiver。
同时可以看到,在FirstReceiver封装的数据,在SecondReceiver被接受到
由于我们在SecondReceiver把广播给停止了,所以ThirdReceive就接受不到对应的广播了。
1.2.5 如果我们把SecondReceiver的abortBroadcast()这个给注释掉,ThirdReceive就可以接受到对应的广播了。对应的log如下:
03-23 11:59:06.609: V/bcDemo(7949): MainActivity onCreate()
03-23 11:59:06.609: V/bcDemo(7949): MainActivity onResume()
03-23 11:59:08.942: V/bcDemo(7949): MainActivity onClick()
03-23 11:59:08.942: V/bcDemo(7949): MainActivity send order broadcast!
03-23 11:59:08.951: V/bcDemo(7949): FirstReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:59:08.954: V/bcDemo(7949): SecondReceiver onReceive() action = com.android.orderbroadcast.START
03-23 11:59:08.954: V/bcDemo(7949): SecondReceiver name = FirstReceiver
03-23 11:59:08.957: V/bcDemo(7949): ThirdReceiver onReceive() action = com.android.orderbroadcast.START
2、 BroadcastReceiver有两种注册方法。
在Androidmainfest中注册广播接收者称为静态注册,在代码中注册称为动态注册。
2.1 静态注册广播
在Androidmainfest.xml中注册(增加对应权限)同时写一个继承BrocastReceiver的类就可以了实现一个静态广播。
在receiver的 intent-filter这里需要写上对应要接收广播的action。同时根据不同广播的权限要求,添加对应的uses-permission
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<receiver android:name="com.android.brocast.BootReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
BootReceiver.java,这个是继承BrocastReceiver的类,实现对应的onReceiver()方法。
package com.android.brocast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class BootReceiver extends BroadcastReceiver {
private final String TAG = "BootReceiver";
@Override
public void onReceive(Context content, Intent intent) {
if (intent == null) {
return;
}
String action = intent.getAction();
Log.i(TAG, "onReceive() action = " + action);
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
Log.i(TAG, "receiver android.intent.action.BOOT_COMPLETED brocast");
}
}
}
一个接收开关广播的静态广播接收器就完成了。
2.2 动态广播
动态广播是在接收广播的Activity或者Service通过registerReceiver()方法注册广播接收器。
一旦对应的Activity或者Service退出,BroadcastReceiver就无法再收到对应的广播了。
应用需要自己new一个intentFilter对象,里面添加需要监听的广播的action。同时需要new一个BrocastReceiver对象,用来处理广播接收到后的处理逻辑。
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent == null) {
return;
}
String action = intent.getAction();
if (BROCAST_ACTION.equals(action)) {
XLog.i(TAG, "receiver com.android.brocast.START brocast");
} else if (Intent.ACTION_CALL.equals(action)) {
XLog.i(TAG, "receiver android.intent.action.CALL brocast");
}
}
};
private void registerBrocastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CALL);
filter.addAction(BROCAST_ACTION);
registerReceiver(mReceiver, filter);
}
附件:对应的source code