目录:
一、什么是广播
二、广播的类型
三、广播接收者的使用
四、广播接收者的注意事项
一、什么是广播
Android四大组件之一,广播分两个角色:
广播发送者:发送标准广播或有序广播;
广播接收者:用于接收Android系统、应用程序发出的广播,并作出响应。
二、广播的类型
按照广播类型分:全局广播、本地广播
全局广播:发出的广播可以被其他任意的应用程序接收,或者可以接收来自其他任意应用程序的广播;
本地广播:只能在应用程序的内部进行传递的广播,广播接收器也只能接收内部的广播,不能接受其他应用程序的广播。
按照广播发送机制分:标准广播、有序广播。
无序广播:广播发出后,所有的广播接收器几乎会在同一时刻接收到这条广播消息,没有先后顺序可言;优点就是效率较高,无法被截断。
有序广播:广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播消息,有先后顺序,每次只发送到优先级较高的接收者那里,按照优先级,一级一级的向下传递。优先级高的接收者可以截断正在传递的广播。
三、广播的使用(代码演示):
1.广播的注册
2.广播的发送
3.广播的接收
4.本地广播的使用
<!-- 1.2 AndroidManifest.xml静态注册 -->
<receiver
android:name="._01_broadcast.BroadcastDemoActivity$MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.test" />
</intent-filter>
</receiver>
public class BroadcastDemoActivity extends AppCompatActivity {
private MyReceiver receiver = new MyReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast_demo);
}
/*
* ---------------------------
* 广播的使用:
* 1.广播的注册
* 2.广播的发送
* 3.广播接收器的使用
* 4.本地广播的使用
* ---------------------------
*/
/**
* 1.广播的注册:动态注册、静态注册
* 1.1 动态注册
* 1.1.1 动态注册的广播要注意跟随其他组件的生命周期进行销毁
*
* 1.2 静态注册:参看AndroidManifest.xml
* 1.2.1 android:enable 表示是否启用这个广播接收器
* 1.2.2 android:exported 表示是否允许这个广播接收本程序以外的广播消息
* 1.2.3 android:priority="1000" 表示在处理有序广播时,能够更靠前优先获取消息,Android官方规定范围:-1000到1000
*/
private void dynamicRegister() {
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.test");
registerReceiver(receiver, filter);
}
/*
* 2.广播的发送
* 2.1 标准广播的发送
* 2.2 有序广播的发送
*/
public void sendBroadcastMessage() {
Intent intent = new Intent();
intent.setAction("android.intent.test");
// 标准广播的发送
sendBroadcast(intent);
// 有序广播的发送
sendOrderedBroadcast(intent, null);
}
/* 3.广播接收器的使用 */
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 接收IntentFilter根据action过滤出的广播消息并处理,如android.intent.test消息
if (intent.getAction() != null) {
switch (intent.getAction()) {
case "android.intent.test":
break;
default:
break;
}
}
/*
* 在接收器中,可以对Intent进行窜改,也可以调用 abortBroadcast() 方法停止往下传递;
* 调用 abortBroadcast() 后,权限比他低的接收器就再也收不到这个广播了。
*/
}
}
/*
* 4.本地广播的使用
* 4.1 本地广播的注册
* 4.1.1 使用本地广播并没有静态注册的方法,因为静态注册主要是为了让程序在未启动的情况下也能收到广播,
* 而发动本地广播的时候,我们的程序已经是启动了,所以,自然是没有静态注册的方式
*
* 4.2 同全局广播一样,本地广播也要注意跟随其他组件的生命周期进行销毁
* 4.3 本地广播发送标准广播、有序广播
*/
public void localBroadcastRegister() {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.test");
localBroadcastManager.registerReceiver(receiver, filter);
}
public void sendLocalBroadcastMessage() {
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
Intent intent = new Intent();
intent.setAction("android.intent.test");
// 发送标准广播
localBroadcastManager.sendBroadcast(intent);
// 发送有序广播
localBroadcastManager.sendBroadcastSync(intent);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 1.1.1 动态注册的广播要注意跟随其他组件的生命周期进行销毁
unregisterReceiver(receiver);
// 4.2 同全局广播一样,本地广播也要注意跟随其他组件的生命周期进行销毁
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.unregisterReceiver(receiver);
}
}
四、广播接收者的注意事项
每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 。
当 onReceive() 方法在 10 秒内没有执行完毕,就会导致ANR。如果需要执行长任务,那么就有必要使用Service。
尽量不使用线程,因为有可能线程没有执行完,应用进程就退出,导致线程运行结果不可靠。
另外注意,BroadcastReceiver 会堵塞主线程。唯有 onReceive() 结束,主线程才得以继续进行。