标签:
一、BroadCastReceiver 简介⑴.静态注册需要自定义一个 BroadcastReceiver 类(继承 BroadcastReceiver 就好),如下:
public class StaticReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
⑵.然后在 AndroidManifest.xml 中注册。 <!-- 注册自定义静态广播接收器 -->
<receiver android:name="com.xjl.brd.receiver.StaticReceiver">
<intent-filter>
<action android:name="com.byread.static" />
</intent-filter>
</receiver>
receiver的属性:
<receiver android:enabled=["true" | "false"] android:exported=["true" | "false"] android:icon="drawable resource" android:label="string resource" android:name="string" android:permission="string" android:process="string" > . . . </receiver>android:exported —— 此 broadcastReceiver 能否接收其他 App 的发出的广播,这个属性默认值有点意思,其默认值是由 receiver 中有无 intent-filter 决定的,如果有 intent-filter,默认值为 true,否则为 false。(同样的,activity/service 中的此属性默认值一样遵循此规则)同时,需要注意的是,这个值的设定是以 application 或者application user id 为界的,而非进程为界(一个应用中可能含有多个进程); android:name —— 此 broadcastReceiver 类名;
private static final String ACTION_STATIC = "com.byread.static"; // 静态注册的Action
Log.e(TAG, "发送自定义静态注册广播消息");
Intent intent = new Intent();
intent.setAction(ACTION_STATIC);
intent.putExtra("msg", "接收静态注册广播成功!");
sendBroadcast(intent); 2.动态注册(即使用代码注册)private static final String ACTION_DYNAMIC = "com.byread.dynamic"; // 动态注册的Action
/**
* 动态注册的 Receiver
*/
private BroadcastReceiver mDynamicReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("MainActivity", "接收自定义动态注册广播消息");
if (intent.getAction().equals(ACTION_DYNAMIC)) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
}
}
};
⑵在 onStart() 方法中实现广播的注册
@Override
protected void onStart() {
super.onStart();
// 注册自定义动态广播消息
IntentFilter filter_dynamic = new IntentFilter();
filter_dynamic.addAction(ACTION_DYNAMIC);
registerReceiver(mDynamicReceiver, filter_dynamic);
}
⑶使用代码注册的广播应当在 onPause() 方法中注销。 @Override
protected void onPause() {
super.onPause();
unregisterReceiver(mDynamicReceiver);
unregisterReceiver(mSystemReceiver);
} ⑷.在需要使用广播的地方调用:Log.e(TAG, "发送自定义动态注册广播消息");
Intent intent2 = new Intent();
intent2.setAction(ACTION_DYNAMIC);
intent2.putExtra("msg", "接收动态注册广播成功!");
sendBroadcast(intent2); 3.注册小结Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.putExtra("name", "qqyumidi");
sendBroadcast(intent);根据广播的发送方式,可以将其分为以下几种类型:sendBroadcast(intent) sendBroadcast(intent, receiverPermission) sendBroadcastAsUser(intent, userHandler) sendBroadcastAsUser(intent, userHandler,receiverPermission)。普通广播会被注册了的相应的感兴趣(intent-filter 匹配)接收,且顺序是无序的。如果发送广播时有相应的权限要求,BroadCastReceiver 如果想要接收此广播,也需要有相应的权限。
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 注册静态系统WIFI广播接收器 -->
<receiver android:name="com.xjl.brd.receiver.SystemReceiver" >
<intent-filter>
<action android:name="android.net.wifi.RSSI_CHANGED" />
<action android:name="android.net.wifi.STATE_CHANGE" />
<action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
</intent-filter>
</receiver> ⑶.Ordered broadcast:有序广播优点:
1,按优先级的不同,优先 Receiver 可对数据进行处理,并传给下一个 Receiver
2,通过 abortBroadcast 可终止广播的传播private LocalBroadcastManager mLocalBroadcastManager; //应用内广播
/**
* 实例一个 LocalBroadcastManager 动态注册的广播
*/
private BroadcastReceiver mLocalReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, "接收 LocalBroadcastManager 动态注册广播消息");
if (intent.getAction().equals(ACTION_LOCAL)) {
String tMsg = intent.getStringExtra("msg");
Toast.makeText(context, tMsg, Toast.LENGTH_SHORT).show();
}
}
}; ⑵.在 onStart() 方法中实例与注册广播 protected void onStart() {
super.onStart();
//注册 LocalBroadcastManager 动态广播消息
IntentFilter tFilterLocal=new IntentFilter();
tFilterLocal.addAction(ACTION_LOCAL);
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
mLocalBroadcastManager.registerReceiver(mLocalReceiver, tFilterLocal);
} ⑶.在需要调用广播的地方使用 LocalBroadcastManager 发送广播 Log.e(TAG, "使用 LocalBroadcastManager 发送广播消息");
Intent tIntentLocal = new Intent();
tIntentLocal.setAction(ACTION_LOCAL);
tIntentLocal.putExtra("msg", "接收 LOCAL 动态注册广播成功!");
//这里使用 LocalBroadcastManager 发送广播,使用 sendBroadcast 无效
mLocalBroadcastManager.sendBroadcast(tIntentLocal); ⑷.在 onPause() 方法中注销广播 @Override
protected void onPause() {
super.onPause();
//注销广播
mLocalBroadcastManager.unregisterReceiver(mLocalReceiver);
}五、不同注册方式的广播接收器回调onReceive(context, intent)中的context具体类型 Intent intent = new Intent();
intent.setAction(BROADCAST_ACTION);
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.putExtra("name", "qqyumidi");
sendBroadcast(intent);注1:对于动态注册类型的 BroadcastReceiver,由于此注册和取消注册实在其他组件(如 Activity)中进行,因此,不受此改变影响。注2:在3.1以前,相信不少 app 可能通过静态注册方式监听各种系统广播,以此进行一些业务上的处理(如即时 app 已经退出,仍然能接收到,可以启动 service 等..),3.1 后,静态注册接受广播方式的改变,将直接导致此类方案不再可行。于是,通过将 Service 与 App 本身设置成不同的进程已经成为实现此类需求的可行替代方案。
以上内容多是来自网络,我只是起到再总结的作用,下面是我自己总结广播的一个Demo
http://download.csdn.net/detail/xiaojinlai123/9472598
标签:
原文地址:http://blog.csdn.net/xiaojinlai123/article/details/50981109