加深理解BroadcastRecever

来源:互联网 发布:java -d path 编辑:程序博客网 时间:2024/02/24 08:17

0、前言

Android四大组件是Activity、Service、BroadcastReceiver和ContentProvider,我们要讲的是BroadcastReceiver,BroadcastReceiver使用起来是蛮简单的,只有简单应用,BroadcastReceiver的存,在我感觉最大的应用,就是不同应用间事件的解耦,并且和系统解耦,我们知道系统中存在很多广播(BroadcastReceiver),而如果应用总是调用系统,和其他app的东西,必然app庞大很多,也不利于解决问题,而BroadcastReceiver就是观察者模式实现的,对于解耦很适合。
其实BroadcastReceiver编写起来很简单,应用也很简单,和一般的监听器很像,只要注册了,就等着事件被调用,所以总结起来BroadcastReceiver,也就注册和等待事件的调用
下面分三个方面来讲解:
1、实际编码实现。
2、测试BroadcastReceiver的接收
3、总结

1、实际编码实现

1.1静态注册

在AS的module右键new->other->BroadcastReceiver解这输入类名就行了
又或者手动新建一个类继承BroadcastReceiver

package space.xxhui.broadcasrreveiver.Broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class StaticReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context,"StaticReceiver",Toast.LENGTH_SHORT).show();    }}

在manifest的application节点中添加

        <receiver            android:name=".Broadcast.StaticReceiver">            <intent-filter>                <action android:name="StaticReceiverAction"></action>            </intent-filter>        </receiver>

1.2动态注册

所谓动态注册就是在代码中写注册代码,而不是上面的在配置文件中写注册的配置文件
先写手动新建一个类继承BroadcastReceiver

package space.xxhui.broadcasrreveiver.Broadcast;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;/** * Created by Administrator on 2017/5/26. */public class DynamicReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "DynamicReceiver",Toast.LENGTH_SHORT).show();    }}

写起来就是写一个监听器(Listener)差不多写

2、测试BroadcastReceiver的接收

这里,我们测试分为本应用的测试和其他应用的测试,发送一个广播识别和匹配靠的是IntentFilter这个类或者intent-filter的声明

2.1本应用测试

首先,我们要把动态注册BroadcastReceiver搞定
在OnCreate方法中最后一行添加如下没下注册:

registerReceiver(receiver,new IntentFilter("DynamicReceiverAction"));//动态注册

可以看到我们使用了IntentFilter这个类进行动态注册
在onDestroy方法中添加如下行,即可

unregisterReceiver(receiver);//动态解注册

如此我们就吧注册和反注册就搞定了。
那么下一步是测试,这里很简单,添加一个button,添加一个点击方法,内容很简单

    public void click(View v){        sendBroadcast(new Intent("StaticReceiverAction"));        sendBroadcast(new Intent("DynamicReceiverAction"));    }

最后代码是这样的
这里写图片描述
这里写图片描述

2.2其他应用测试

其实新建一个module,再添加个button,添加点击事件即可,因为广播是全局的,每个应用都能收到,只要识别和匹配上就会响应

    public void click(View view){        sendBroadcast(new Intent("StaticReceiverAction"));        sendBroadcast(new Intent("DynamicReceiverAction"));    }

3、总结

接上,其实我想说的是我的手机并没有测试成功,即没有弹出一个toast内容是StaticReceiver,其实国产定制的android系统,屏蔽了一些东西,比如广播,开机广播就是其中一个
在应用开启的时候,并动态注册了:
期望:自己能接收广播,其他应用给本应用的广播也能接收
实际:本应用能处理自己的发送的广播,其他应用的也能处理

在本应用关闭的时候:
期望:没开启应用(即没有后台),能接收到静态广播
实际:什么Toast也没出现,本该出现StaticReceiver的Toast的
实验:在安卓4.0的旧机子上,能出现StaticReceiver的Toast

总结起来:
1、BroadcastRecever是一个观察者模式实现的Android组件
2、组件使用与Listener的使用差不多
3、静态注册的广播按道理应该能接收所能识别和匹配的广播,不管应用开不开启,实际上要看国产Android系统的优化
4、静态注册的广播在应用安装的时候已经注册到系统中
5、动态注册的广播,只能注册完才能接收广播,需要在适当的时候反注册
6、单单启动应用是不能接收动态注册的广播的,还需要代码动态注册

原创粉丝点击