[TOC]
Broadcast.png1. 什么是Broadcast
- Android四大组件之一
- 为了便于进行系统级别的消息通知,引入的类似广播的消息机制
2. Broadcast使用
Android中的广播使用更加灵活,可以自行对感兴趣的广播内容进行注册,这样就只会接受到自己关心的内容
2.1 广播
类型
-
标准广播
完全异步执行的广播,广播发出之后,所有接收器几乎同时收到,没有先后顺序
效率高,无法被拦截
-
有序广播
同步执行的广播,同一时刻只有一个接收器收到消息,该接收器逻辑执行完毕后广播才会继续传递,有先后顺序
优先级高的广播接收器可以截断正在传递的广播,导致后续无法接收
广播的发送
-
系统广播
由系统主动发送,自定义的广播接收器主动声明特定的Action来进行注册接受广播 广播Action 备注 网络变化 "android.net.conn.CONNECTIVITY_CHANGE"
需要 android.permission.ACCESS_NETWORK_STATE
权限屏幕被关闭之后的广播 Intent.ACTION_SCREEN_OFF
屏幕被打开之后的广播 Intent.ACTION_SCREEN_ON
... ...
-
发送自定义广播
在自定义的广播接收器中声明一致的Action后就可以注册接收到
标准广播-通过sendBroadcast(Intent intent)来发送广播
sendBroadcast(new Intent(MyReceiver.ACTION_ONE));
有序广播-通过sendBroadcast(Intent intent, String receiverPermission)
sendBroadcast(new Intent("com.j.order.test"),"com.j.order");
receiverPermission 是用于对广播发送,接受进行权限控制的。
发送广播设置时,要求Receiver有这个权限才能处理这个广播
接收广播设置时,要求发送方有这个权限才处理它发送的广播
发送方设置是在sendBroadcast(Intent intent, String receiverPermission)中设置
接收方需要在清单文件中设置<uses-permission android:name="com.j.order"/> <permission android:name="com.j.order"/> ... <receiver android:name=".StaticReceiver" android:enabled="true" android:exported="true" android:permission="com.j.order"> <intent-filter android:priority="100"> <action android:name="com.j.order.test"/> </intent-filter> </receiver> ...
priority 是设置接收器的优先级高低,默认为0,值越大优先级越高
2.2 广播接收器
定义广播接收器
//继承BroadcastReciver 重写onReccive方法
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
public static final String ACTION_ONE = "com.broadcast.custommsg.one";
public static final String ACTION_TWO = "com.broadcast.custommsg.two";
@Override
public void onReceive(Context context, Intent intent) {
if (ACTION_ONE.equals(intent.getAction())) {
Toast.makeText(context,TAG+"onReceive: " + "ACTION_ONE",Toast.LENGTH_SHORT).show();
}
if (ACTION_TWO.equals(intent.getAction())) {
Toast.makeText(context,TAG+"onReceive: " + "ACTION_TWO",Toast.LENGTH_SHORT).show();
}
//用于截断有序广播的传递
abortBroadcast();
}
}
广播注册
-
静态注册
静态注册是在清单文件中就进行注册的//在清单文件中注册,在intent-filter中定义接收的广播 <receiver android:name=".MyReceiver" android:enabled="true" //表示组件是否可用 android:exported="true">//表示是否接收其他外部信息 <intent-filter> <action android:name="com.broadcast.custommsg.one"/> <action android:name="com.broadcast.custommsg.two"/> </intent-filter> </receiver>
-
动态注册
动态注册可以自由的控制注册与注销,比较灵活,但是必须要程序启动之后才能生效//在需要的地方进行注册,需要及时的进行反注册 MyReceiver myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction(MyReceiver.ACTION_ONE); filter.addAction(MyReceiver.ACTION_TWO); registerReceiver(myReceiver, filter);
2.3 本地广播的使用
本地广播是为了解决广播的安全性问题,确保发出的广播只能在应用的内部进行传递,同时广播接收器也只能接收本应用程序的广播
本地广播的使用与全局广播类似,只不过由LocalBroadcastManager来控制广播的注册、注销及发送。本地广播因使用时程序已启动,所以不需要也不能使用静态注册
LocalBroadcastManager broadcastManager = LocalBroadcastManager.getInstance(this);
IntentFilter filter = new IntentFilter();
String action = "com.j.local.b";
filter.addAction(action);
localReceiver = new LocalReceiver();
broadcastManager.registerReceiver(localReceiver, filter);
broadcastManager.sendBroadcast(new Intent(action));
// LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver);
class LocalReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
}
}
网友评论