Broadcast是一种广泛运用的、在应用程序之间传输信息的机制,广播机制是一个典型的发布-订阅模式,也就是我们所说的观察者模式。通过这样的形式来达到接、收双方的完全解耦合。可使用EventBus框架替代广播的使用。
发送方和接收方不存在必然联系;BroadcastReceiver会堵塞主线程只有onReceive()结束,主线程才得以继续进行;每次广播到来时,会重新创建BroadcastReceiver对象,并且调用onReceive()方法,执行完以后该对象即被销毁当onReceive()方法在10秒内没有执行完毕,就会导致ANR。(程序无应答)
广播的分类:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
/**逻辑操作**/
System.out.println("收到了广播,进行了处理!!!");
}
}
静态注册的广播接收器应用程序关闭后,仍在后台接收广播。在AndroidManifest.xml中注册receiver组件。
<receiver android:name=".MyBroadcastReceiver1" >
//用来过滤掉该广播接收器不感兴趣的广播消息
<intent-filter>
<action android:name="android.intent.action.EDIT" />
</intent-filter>
</receiver>
动态注册的广播接收器Activity关闭后,广播接收器关闭。
public class TwoActivity extends Activity {
// 过滤器
private IntentFilter filter;
// 广播接收器
private MyBroadcastReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.one);
filter = new IntentFilter("android.intent.action.EDIT");
receiver = new MyBroadcastReceiver();
// 注册广播,并指定过滤器
registerReceiver(receiver, filter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 取消广播注册
unregisterReceiver(receiver);
}
}
//自定义广播接收器:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context arg0, Intent arg1) {
//过滤广播消息
if ("android.intent.action.EDIT".equals(action)) {
/**逻辑操作**/
System.out.println("收到了广播,进行了处理!!!");
}
}
}
Context.sendBroadcast();
发送的有序广播,被广播接收器接收的时候是有次序的接收,接收次序与receiver的intent-filter的android:priority属性有关,数值越大优先级越高,当广播接收到广播后可通过setResult()和getResult()分别设置向下个广播接收器传递数据,获取数据。
//设置优先级
<receiver android:name=".MyBroadcastReceiver1" >
//用来过滤掉该广播接收器不感兴趣的广播消息
//优先级数值为-1000~1000
<intent-filter android:priority="100">
<action android:name="android.intent.action.EDIT" />
</intent-filter>
</receiver>
//发送有序广播
Context.sendOrderedBroadcast();
发送的非本地广播都是全局的,就是手机上其他应用的广播接收器也可能会收到(如果指定了相同的action)。为了解决这个问题在API21中引入了本地广播LocalBroadcastManager ,本地广播就是将发送的广播局限在该应用中,不被其他应用收到。
相关方法:
//注册广播
LocalBroadcastManager.getInstance(context).registerReceiver(receiver, intentFilter);
//注销广播
LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver);
//发送本地广播
LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent());
LocalBroadcastManager.getInstance(context).sendBroadcastSync(new Intent());
粘性广播会一直滞留,当有匹配此广播的接收器被注册后,该广播接收器会收到此广播。粘性广播只保留最后一条广播,并且一直保留下去。简言之就是,在广播发送之后注册的广播接收器也会收到该广播。
添加权限:
<uses-permission android:name="android.permission.BROADCAST_STICKY"/>
//发送粘性广播
context.sendStickyBroadcast(new Intent());
天行健,君子以自强不息;地势坤,君子以厚德载物。