定义
1、分为全局广播和本地广播。
2、是Android四大组件之一。
3、两部分:广播发送者、广播接收者、消息中心(处理消息)。
原理
广播和设计模式中的观察者模式一样:基于消息的发布 / 订阅事件模型。因此,Android将广播的发送者 和 接收者 解耦,使得系统方便集成,更易扩展
注册
静态注册
<!--静态注册-->
exported 对外公开,默认false
<receiver
android:name=".MyBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.AIRPLANE_MODE"/>
</intent-filter>
</receiver>
动态注册
不同App接广播,调频要一样。
//动态注册最好写在onResume
@Override
protected void onResume() {
super.onResume();
//实例化BroadcastReceiver 子类 & intentfiler
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.setPriority(1);
//设置接收广播的类型 - 调频
intentFilter.addAction("kkkkllll");
//动态注册 调用context 的 registerReceiver()
registerReceiver(myBroadcastReceiver,intentFilter);
//本地广播 - 注册
// instance.registerReceiver(myBroadcastReceiver,intentFilter);
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.setPriority(2);
intentFilter1.addAction("kkkkllll");
registerReceiver(new MyBroadcastReceiver(),intentFilter1);
}
/**
* 注册广播后,要在相应位置记得销毁广播
* 即在onPause()中 unregisterReceiver(myBroadcastReceiver)
* 当此Activity实例化时,会动态将myBroadcastReceiver添加到系统中
* 当此Activity销毁时,动态注册的myBroadcastReceiver 将不再接收到相应的广播
*/
@Override
protected void onPause() {
super.onPause();
//解除注册
unregisterReceiver(myBroadcastReceiver);
}
广播发送者
发送的消息:
private void setReceive() {
Intent intent = new Intent();
intent.setAction("kkkkllll");
Bundle bundle = new Bundle();
bundle.putString("name","Asuna");
intent.putExtras(bundle);
Log.i("TAG", "setReceive: "+bundle);
//无序方法发送方法
sendBroadcast(intent);
// sendOrderedBroadcast(intent,null,new MyBroadcastReceiver2(),new Handler(), Activity.RESULT_OK,"MainActivity发送广播",bundle);
//本地发送
// instance.sendBroadcast(intent);
}
广播接受者
自定义类继承BroadcastReceiver,重写onReceive()方法。
public class MyBroadcastReceiver extends BroadcastReceiver {
//接收广播后,自动调用该方法
@Override
public void onReceive(Context context, Intent intent) {
Log.i("TAG", "onReceive: 已经接收到广播?");
String name = intent.getExtras().getString("name");
//写入接收广播后的操作
Log.i("TAG", "onReceive: 已经接收到广播"+name);
Bundle bundle = new Bundle();
bundle.putString("aaa","Amlv");
setResultExtras(bundle);
//中间截断广播
// abortBroadcast();
}
}