第六章 BroadcastReceiver
6.1 BroadcastReceiver简介
广播是一种运用在引用程序之间传递消息的机制,广播接收者时android四大组件之一。
当android系统产生一个广播事件时,可以有多个BroadcastReceiver接收并进行处理,这些BroadcastReceiver只需要在清单文件或者代码中进行注册并指定要接收的广播事件,然后创建一个类继承自BroadcastReceiver类,重写onReceive()方法,在方法中处理广播事件即可。
6.2 BroadcastReceiver入门
6.2.1 BroadcastReceiver的创建
new -> other -> BroadcastReceiver
下面的Exported复选框用于选择是否接收当前程序外的广播,Enable复选框用于选择广播接收者是否可以由系统实例化。
创建后代码如下所示:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
onReceive方法用于实现广播接收者的相关操作,由于该方法尚未实现,因此会抛出异常,在实现该方法时删除异常即可。
通过上面的方法创建广播接收者,Studio工具会自动在AndroidManifest.xml文件中注册广播接收者。不需要手动添加,上述广播接收者的注册方式时静态注册,这种静态注册的特点是无论应用程序是否处于运行状态,广播接收者都会对程序进行监听。
静态注册是在清单文件中注册 , 动态注册是在Activity中代码注册,但当Activity销毁时广播接收者也随之移除。
public class MainActivity extends AppCompatActivity{
private MyReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化广播接收者
receiver = new MyReceiver();
//实例化过滤器并设置要过滤的广播
String action = "android.provider.Telephoney.SMS_RECEIVED";
IntentFilter intentFilter = new IntentFilter(action);
registerReceiver(receiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
6.3 自定义广播
6.3.1 自定义广播的发送与接收
安卓中自定义了很多广播类型,只需要创建对应的广播接收者接收即可。当系统提供的广播不能满足需求时,可自定义广播,同时需要编写对应的广播接收者。
下面就创建并发送了了一个Help_Stitch类型的广播事件,光有广播事件还不行,必须要有对应的广播接收者。我们创建一个广播接收者后会自动注册,但是广播接收者接收的广播类型要我们自己设置。如下
public void click(View view) {
Intent intent = new Intent();
intent.setAction("Help_Stitch");
sendBroadcast(intent);
}
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<!--下面是设置接收的广播类型-->
<intent-filter>
<action android:name="Help_Stitch"></action>
</intent-filter>
</receiver>
6.4 广播的类型
6.4.1 有序广播和无需广播
-
有序广播
无序广播时完全异步执行的发送广播时,所有监听此广播的广播接收者都会收到此广播消息,但接收和执行的顺序不确定。无序广播的效率比较高,但无法被拦截,
-
有序广播
有序广播是按照接收者声明的优先级被依次接收,发送广播时只有一个广播接收者会收到消息,当在此接收者执行完毕后才会继续传递。相较于无序广播,有序广播效率较低,但是可被拦截的。
优先级:在标签中通过属性设置优先级,值越大优先级越高。优先级相同时先注册的接收者先接收
sendOrderedBroadcast(intent,null);//发送有序广播 abortBroadcast(); //拦截广播,只能拦截有序广播,拦截无序广播也能成功拦截,但再次发送该无需广播时会报错
指定广播接收者:在发送有序广播时要指定某个接收者一定要接收到广播,无论它的优先级多低
Intent intent = new Intent(); intent.setAction("order_broadcast"); OrderReceiver2 receiver2 = new OrderReceiver2(); sendOrderedBroadcast(intent,null,receiver2,null,0,null,null);
可以看到虽然事件被拦截了,但是我们指定的接收者仍然接收到了广播