您的位置:首页 > 移动开发 > Android开发

Android四大组件之BroadcastReceiver必备知识点

2018-02-06 15:40 537 查看
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(); //终止消息再传递
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: