Android四大组件之BroadcastReceiver必备知识点
Android 广播分为两个角色:广播发送者、广播接收者
Android中的广播使用了设计模式中的观察者模式:基于消息的发布 / 订阅事件模型
1.静态注册
1>注册方式:在AndroidManifest.xml里通过标签声明
<receiver
//此广播接收者类是mBroadcastReceiver
android:name=".MyBroadcastReceiver">
//用于接收网络状态改变时发出的广播
<intent-filter>
<action android:name="android.intent.action.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
2>在Activity中调用:
Intent intent = new Intent();
intent.setAction("android.intent.action.MY_BROADCAST");
intent.putExtra("msg", "hello receiver.");
sendBroadcast(intent);
2.动态注册
动态注册的程序只有在程序运行时才会收到广播消息,程序不运行了,它就收不到了。
MyReceiver receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.MY_BROADCAST");
registerReceiver(receiver, filter);
注销:unregisterReceiver(receiver);
补充:BroadcastReceiver的生命周期
BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。
有序广播:sendOrderedBroadcast(intent, null);
<receiver android:name=".MyReceiver">
<intent-filter android:priority="8">
<action android:name="android.intent.action.MY_BROADCAST"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
在Intent-filter中添加一个android:priority=”8”属性,这个就是接收器优先级,数字越大的接收器,优先级越高,越先接到广播。
在一个接收器收到发来的Intent后,可以对其进行更改,对发送来的广播Intent进行修改是利用setResultExtras(bundle);
public class FirstRecever extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//先获得传过来的MSG
String msg = intent.getStringExtra("msg");
Log.i(TAG, "FirstRecever:"+msg);
//接收通过setResultExtras传过来的msg
String msg = getResultExtras(true).getString("msg");
Log.i(TAG, "SecondReceiver: " + msg);
//更改广播数据
Bundle bundle = new Bundle();
bundle.putString("msg", msg + "@FirstReceiver");
setResultExtras(bundle);
}
}
通过setResultExtras(bundle); 传递的数据是不会更改原生广播的数据的。也只是原来广播数据中额外添加的数据
可以使用abortBroadcast(); //终止消息再传递