一、广播机制简介
Android中引入了广播机制,用于组件之间、组件内部的消息传递。广播机制主要分为两个方面:广播发送者和广播接收器(BroadcastReceiver——对发送的广播进行过滤接收并响应)。发送者发出一条广播,“订阅”了该广播的接收器就能收到这条广播,并作出相应的响应。在Android中,广播被广泛地使用,例如:在开机后系统会产生一条广播,接收到该广播的应用程序就能启动服务。又如:应用程序在完成某个事件后发出一条广播,通知另一个应用程序。即广播有系统广播,应用程序也可以自定义广播。
二、广播的三种类型
- 普通广播(Normal Broadcasts):所有监听该广播的接收器都能收到广播,且没有先后顺序。接收器不能截断广播,也不能处理广播内容。
- 有序广播(Ordered Broadcasts):按照接收者的优先级顺序接收广播,优先级高者可以截断广播。接收者可以对广播内容进行处理。
- 异步广播:(粘滞性滞留广播):不能将处理结果传给下一个接收者,无法终止广播。
三、BroadcastReceiver的生命周期
每次广播到来时,会创建一个BroadcastReceive对象,并执行onReceive()方法,执行完后,该对象就会被立即销毁。BroadcastReceive整个生命周期只有十秒左右,如果onReceive()方法在十秒内没有执行完,程序会报错。因此,不能在onReceive()方法中做耗时操作,可以交由Service来完成。
四、BroadcastReceiver用法
1.自定义BroadcastReceiver
继承BroadcastReceiver,实现抽象方法onReceive(context,intent)。在onReceive方法中写收到广播后的响应事件。
public class TestBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Received Broadcast",Toast.LENGTH_LONG).show();
}
如果接收的是有序广播,则可在onReiceive方法中对广播内容进行处理或者调用abortBroadcast()方法来截断广播。
2.注册BrasdcastReceiver——静态 or 动态注册
1)静态注册
静态注册是在AndroidManifest.xml文件中配置的。通过这种方式注册的广播为常驻型广播,当应用程序关闭后,有相应事件触发程序还是会被系统自动调用运行。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ginny.test">
<application
...
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.test.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name=".AnotherBroad">
<intent-filter android:priority="100"> <!--设置优先级。数字越大优先级越大(同优先级,动态注册优先于静态注册)-->
<action android:name="com.example.MY_text">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
在application标签中添加一个receiver标签,通过android:name指定接收器,然后在中添加要接收的广播。
2)动态注册
通过代码在.Java中注册。通过这种方式注册的广播会跟随Activity的生命周期,需要在Activity结束前调用unregisterReceiver(receiver)方法移除它。
TestBroadcastReceiver receiver=new TestBroadcastReceiver();
IntentFilter filter=new IntentFilter();
filter.addAction("com.example.MY_text");
registerReceiver(receiver, filter);
动态注册的广播一定要注销:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
五、发送广播
1.发送普通广播
创建一个Intent对象,传入要发送的广播的值,再调用sendBroadcast(intent)方法将广播发送出去。
Intent intent = new Intent("com.example.MY_text");
sendBroadcast(intent);
2.发送有序广播
调用sendOrderedBroadcast(intent,receiverPermission)方法。该方法要传入两个参数,其中receiverPermisson是接收权限,可以为null,这里设置一个“TestPermission”权限。
Intent intent = new Intent("com.example.MY_text");
sendOrderedBroadcast(intent,“TestPermission”);
在manifest中添加“TestPermission”权限。
<permission android:name="TestPermission" android:protectionLevel="normal">
</permission>
声明要使用该权限
<uses-permission android:name="TestPermission"/>
3.发送异步广播
调用sendStickyBroadcast(intent)方法。
Intent intent = new Intent("com.example.MY_text");
sendStickyBroadcast(intent);
发送异步广播需要在manifest中声明权限”android.permission.BROADCAST_STICKY”
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
异步广播处理完之后的intent依然存在,直到把它去掉,即调用方法removeStickyBroadcast(intent);