Broadcast
广播介绍&使用
-
广播是android中各个模块通信的一种方法。有发送方,接收方。
-
发广播的方式如下代码:
Intent intent = new Intent(); intent.setAction("com.xxx.just_for_test"); sendBroadcast(intent);
3.广播的接受有两种方式(1)静态注册(2)动态注册
(1)动态注册
IntentFilter filter = new IntentFilter();
filter.addAction("com.xxx.just_for_test");
this.registerReceiver(mReceiver, filter);
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG", "onReceive: ");
}
};
onReceive中就是对接受到这个广播的处理,注意动态注册的在最后要进行unRegisterReceiver()跟activity的生命周期保证一致。
(2)静态注册
首先要在manifest中注册:
<receiver android:name=".TestReceiver"
android:enabled="true" //表示可以接受到信息。
android:exported="true">//表示可以接收到外部APK的信息
<intent-filter>
<action android:name="com.xxx.just_for_test"/>
</intent-filter>
</receiver>
注意action 要对应,然后新起一个类
public class TestReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG","onReceive");
}
}
这样两个广播的方式就都写出来了,简单的用法就是这样。唯一需要注意的就是onReceive方法中是在主线程执行的,10S干不完事情就会报ANR。
例外用内部类实现也是可以的,但是要使用静态内部类,首席实例化xml的时候会去实例化你这个内部类,非静态内部类的实现要通过父类,因为父类没有实例化 所以会一直报错has no zero argument constructor。设置成静态内部类就没有这个问题。
这里可以mark一下,java基础。
广播分类
-
普通广播
普通广播就是我们调用的sendBroadcast(),只要注册了action的Receiver(不同的APP也可以)都可以接到,但是接到的这个的过程是异步的,谁先谁后不知道。 -
有序广播
就是考虑一个优先级。取值范围-1000~1000越大优先级越高 静态:<intent-filter android:priority="100"> <action android:name="com.xxx.just_for_test"/> </intent-filter>
动态:
IntentFilter filter = new IntentFilter();
filter.addAction("com.xxx.just_for_test");
filter.setPriority(100);
会按照设置的Priority来先后调用注册的receiver。高等级的receiver可以调用abortBroadcast();来阻止下面的接收到这个广播。
- 本地广播
这个其实就是为了不让其他APP跟我们这边APP进行通信处理。使用方法如下
public static void sendLocalBroadcast(Intent intent) {
LocalBroadcastManager.getInstance(getInstance()).sendBroadcast(intent);
}
public static void registerLocalReceiver(BroadcastReceiver receiver, IntentFilter filter) {
LocalBroadcastManager.getInstance(getInstance()).registerReceiver(receiver, filter);
}
public static void unregisterLocalReceiver(BroadcastReceiver receiver) {
LocalBroadcastManager.getInstance(getInstance()).unregisterReceiver(receiver);
}
- Sticky广播
现已经废弃。
使用广播遇到的问题
其实广播的分类应该还有一个系统广播,这个广播由系统发出,比如开机广播。之所以没在上面进行介绍,是因为这个广播在android 8.0新特性中有了一些新的规定。部分通过静态注册的系统广播不再可以进行接受。因为静态广播的注册一直是在后台消耗一定资源的。通过动态注册可以解决这个问题。 当然还有发送的intent设置FLAG_RECEIVER_EXCLUDE_BACKGROUND;时候也不能接收到广播,8.0之后intent设置值的时候需要带上
贴图片是为了更好的看懂两个参数是什么。
查看一下RECEIVER_EXCLUDE_BACKGROUND,发现对应的Flag:FLAG_RECEIVER_INCLUDE_BACKGROUND = 0x01000000;即我们可以通过intent.addFlags(0x01000000);也可以进行突破限制 实现广播的正常使用。
网友评论