广播是什么?
一种相互通信,传递信息的机制,组件内、进程间(App之间)
如何使用广播?
组成部分
发送者-发送广播
与启动其他四大组件一样,广播发送也是使用intent发送。
- 设置action:表示这个广播可以被哪些接收器接收到
- 通过 putExtra,传递额外的bundle信息
Intent intent = new Intent();
intent.setAction(SEND_STATIC_ACTION);
intent.putExtra("data","静态广播");
sendBroadcast(intent);
接收者-广播接收
创建广播接收器
继承 BroadcastReceiver 类
或直接new该类的对象实例,然后重写方法 onReceive,在该方法中处理接收到的广播消息。
注册广播接收器
注册广播接收器有两种办法,静态注册和动态注册,可以分为两种广播
- 静态广播:常驻内存中,是在Manifest文件中注册的,可在App未启动时就监听广播
- 动态广播:App启动后注册,是在代码中注册以及解除注册的广播,解除注册后,广播也随时结束。
同时注册时,动态优于静态
静态广播
创建广播接收器类
// 静态广播接收器
public class StaticBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d("BroadcastReceiver","静态广播接收器接受了一个 - "+bundle.getString("data"));
}
}
在 Manifest文件中注册广播接收器
<receiver android:name=".broadcastreceiver.receiver.StaticBroadcastReceiver"
android:exported="true">
<intent-filter>
<action android:name="send_static_action"></action>
</intent-filter>
</receiver>
动态广播
创建广播接收器
直接new该类的对象实例,然后重写方法 onReceive
// 创建广播接收器
private BroadcastReceiver dynamicBroadcastReceiver= new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
Log.d("BroadcastReceiver","动态广播接收器接受了一个 - "+bundle.getString("data"));
}
};
注册广播接收者器类
一般在Activity的onCreate方法中注册
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_study);
// 动态注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SEND_DYNAMIC_ACTION);
registerReceiver(dynamicBroadcastReceiver,intentFilter);
}
解除注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(dynamicBroadcastReceiver);
}
无序广播、有序广播
按照广播接收顺序划分
- 无序广播-普通广播:所有接收器接收的广播没有先后顺序,几乎同时收到消息
- 有序广播:发送的广播会按照接收器的优先级顺序被接受,同一时刻只会有一个接收器收到广播,且收到广播之后可以对广播进行截断和修改
有序广播
发送
使用语句 sendOrderedBroadcast
广播接收器
注册时,设置优先级,优先级越大越先收到广播
// 动态注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(SEND_DYNAMIC_ACTION);
intentFilter.setPriority(100);
registerReceiver(dynamicBroadcastReceiver, intentFilter);
// 注册有序广播
// 有序广播设置优先级,优先级越大越先收到
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction(SEND_DYNAMIC_ACTION);
intentFilter1.setPriority(101);
registerReceiver(broadcastReceiver2, intentFilter1);
截断广播
abortBroadcast(); 优先级高的广播接收器截断广播之后,下游的广播就不再会收到。
修改广播
上游的广播 使用 setResultExtras 传递一个新的 Bundle 或者使用 setResultData 传递一个字符串下游使用 getResultExtras 接收 Bundle,使用 getResultData 接收字符串
全局广播、本地广播
按照广播的传播范围划分
- 本地广播:app内部
- 全局广播:整个手机内部
全局广播
普通广播就是全局广播。
一个发送全局广播,在另一个app中接收到的例子:
App1
1.发送广播
Intent intent = new Intent();
intent.setAction(SEND_GLOBAL_ACTION);
intent.putExtra("data_global", "发送了一条全局广播");
sendBroadcast(intent);
App2
1.创建广播接收器,处理接收数据
// 接收来自 Androidsutdio App的广播
// 创建广播接收器
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, intent.getExtras().getString("data_global"), Toast.LENGTH_LONG).show();
Log.d("接受全局广播", intent.getExtras().getString("data_global"));
}
};
2.注册广播接收器
action与发送广播的action相同
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("send_global_action");
registerReceiver(broadcastReceiver, intentFilter);
}
3.解除广播接收器
@Override
protected void onDestroy() {
super.onDestroy();
// 解除广播接收器
unregisterReceiver(broadcastReceiver);
}
此时是由App2弹出的这条弹窗。
app2的logcat:
本地广播
只能使用动态注册,因为本地广播只能监听这个app内部的广播,在注册发送广播时,需要使用到LocalBroadcastManager 类。
注册
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_study);
// 注册本地广播 - 只能动态注册
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter local_intentFilter = new IntentFilter();
intentFilter1.addAction(SEND_LOCAL_ACTION);
localBroadcastManager.registerReceiver(new LocalBroadcastReceiver(),local_intentFilter);
}
发送
Intent intent = new Intent();
intent.setAction(SEND_LOCAL_ACTION);
intent.putExtra("data", "本地广播");
localBroadcastManager.sendBroadcast(intent);
解除注册
Intent intent = new Intent();
intent.setAction(SEND_LOCAL_ACTION);
intent.putExtra("data", "本地广播");
localBroadcastManager.sendBroadcast(intent);
广播的作用?
传递信息。