Android基础进阶之Broadcast(广播接受者)的学习和研究
2016-04-19 22:22
645 查看
-1. 作为四大组件之一的广播(Broadcast)是Android中尤为重要的一个组件,广播接受者(BroastReceiver)是对发送的广播进行过滤并且接收的组件,主要是接收系统中或者应用中发过来的广播,那广播也是作为移动开发初学者必须具备的知识储备,那广播到底是干什么的呢?其实它是Android中在应用程序之间或者是说进程之间传递数据(Intent)的一种机制和方式,如果没有这个机制的话,我们在两个activity传递数据的话就非常麻烦,所以Android给我们提供了这样的机制去使用,那广播都用在什么地方呢?比如我们手机开机的时候、手机网络状态发送改变的时候、手机电量发生改变的时候、自己里面手机应用卸载的时候、手机开机等等系统都会发出一条广播。那广播究竟该怎么用呢?
-2.广播的用法很简单就是把数据信息放到intent里面,最常见的一种方式就是intent.setAction(“xxxx”)里面写入一个自定义的字符串,然后sendBroadcast(intent)将广播发送出去,这个时候同学们要知道有两种发送广播的方式,sendOrderedBroadcast(intent)这种是发有序的广播,二者有什么区别,我们稍后再讲,当我们用intent将广播发送之后,所有已经注册广播接受者BroastReceiver会校验注册时的intentfilter是否与intent发送过来的里面的字符串匹配,如果匹配了则会调用我们自定义广播里面的重写方法onReceive(). 下面就说一些广播的两种发送方式和两种注册以及注册的区别、以及代码演示。
两种发送方式:无序sendBroadcast和有序sendOrderedBroadcast
1、无序广播:同级别接收广播是随机的、无序的;级别低的先接收到广播;接收器不能处理和截断广播的进行;同级别的动态注册高于静态注册。
2、有序广播:同样也是同级别接收广播是随机的,但是是有序的;同样也是动态的注册高于静态注册;但是因为她是有序广播,所以接收器既能截断广播也能处理广播。
如图所示即为两种注册广播方式的区别:
上图则是两种注册方式,我个人还是觉得动态注册比价好,因为动态更加具有专一性和针对性(针对某一个activity或者是service)。
-3.代码演示及理解。说了那么多关于概念性的东西,下面就来动手实践一下吧。
3.1发送一条普通广播
布局文件xml代码:如下
此时自定义广播是这样的形式:
那么则在log日志中则有以下日志:
3.1.1.此时我们在注册一个广播BC3,内容和BC2一样,在清单配置文件中则存在优先级的问题:
如果在每个广播的接收不写优先级或者是优先级是一样的话,则两个广播同时会收到发送广播的消息,那优先级高的将首先会收到广播。
动态注册广播的话是在代码中的setcontview方法执行之后进行的,形式如下:
则还是显示bc2先接受到广播这就说明动态注册广播要比静态注册广播优先级要高。其中,普通广播是不能中断广播的abortBroadcast(),而有序广播却可以中断其他的广播。
3.1.2接收器不能处理广播
在BC3和BC2中的广播增加如下代码:
此时的log日志:
很显然得不到数据也就是不能够处理广播。
3.2. 发送一条有序广播
当发送普通广播的时候,接收器是不能处理广播的,但是有序广播却可以处理广播。那在activity中增加有序广播的代码:
其他的保持不变则打印的结果为:
-2.广播的用法很简单就是把数据信息放到intent里面,最常见的一种方式就是intent.setAction(“xxxx”)里面写入一个自定义的字符串,然后sendBroadcast(intent)将广播发送出去,这个时候同学们要知道有两种发送广播的方式,sendOrderedBroadcast(intent)这种是发有序的广播,二者有什么区别,我们稍后再讲,当我们用intent将广播发送之后,所有已经注册广播接受者BroastReceiver会校验注册时的intentfilter是否与intent发送过来的里面的字符串匹配,如果匹配了则会调用我们自定义广播里面的重写方法onReceive(). 下面就说一些广播的两种发送方式和两种注册以及注册的区别、以及代码演示。
两种发送方式:无序sendBroadcast和有序sendOrderedBroadcast
1、无序广播:同级别接收广播是随机的、无序的;级别低的先接收到广播;接收器不能处理和截断广播的进行;同级别的动态注册高于静态注册。
2、有序广播:同样也是同级别接收广播是随机的,但是是有序的;同样也是动态的注册高于静态注册;但是因为她是有序广播,所以接收器既能截断广播也能处理广播。
如图所示即为两种注册广播方式的区别:
上图则是两种注册方式,我个人还是觉得动态注册比价好,因为动态更加具有专一性和针对性(针对某一个activity或者是service)。
-3.代码演示及理解。说了那么多关于概念性的东西,下面就来动手实践一下吧。
3.1发送一条普通广播
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void doClick(View v){ switch (v.getId()) { case R.id.send1://发送一条普通广播 Intent intent = new Intent(); intent.putExtra("msg", "这是一条普通广播"); > 必须要设置acition和category, 用来在功能清单配置文件里面的intent-filter进行过滤,可以这样理解发送广播的过程:把信息(String类型、boolean类型等等)发送给特定的对象(特定的对象就是setAction的动作)。 intent.setAction("jin_wen"); sendBroadcast(intent); break; } }
布局文件xml代码:如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <Button android:id="@+id/send1" android:onClick="doClick" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" android:text="发送一条普通广播" /> <Button android:id="@+id/send2" android:onClick="doClick" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/send1" android:text="发送一条有序广播" /> </RelativeLayout>
此时自定义广播是这样的形式:
public class BC2 extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String s = intent.getStringExtra("msg"); System.out.println("reveiver2收到消息:"+s); } }
那么则在log日志中则有以下日志:
3.1.1.此时我们在注册一个广播BC3,内容和BC2一样,在清单配置文件中则存在优先级的问题:
<receiver android:name="com.demo.broadcastreceiverdemo.BC2" > <intent-filter android:priority="200" > <action android:name="jin_wen" /> </intent-filter> </receiver> <receiver android:name="com.demo.broadcastreceiverdemo.BC3" > <intent-filter android:priority="100" > <action android:name="jin_wen" /> </intent-filter> </receiver>
如果在每个广播的接收不写优先级或者是优先级是一样的话,则两个广播同时会收到发送广播的消息,那优先级高的将首先会收到广播。
动态注册广播的话是在代码中的setcontview方法执行之后进行的,形式如下:
setContentView(R.layout.activity_main); IntentFilter intentfilter = new IntentFilter("BC_One"); BC2 bc2 = new BC2(); registerReceiver(bc2, intentfilter);
则还是显示bc2先接受到广播这就说明动态注册广播要比静态注册广播优先级要高。其中,普通广播是不能中断广播的abortBroadcast(),而有序广播却可以中断其他的广播。
3.1.2接收器不能处理广播
在BC3和BC2中的广播增加如下代码:
String s = intent.getStringExtra("msg"); System.out.println("reveiver3收到消息:"+s); Bundle bundle = new Bundle(); bundle.putString("test", "广播处理的数据"); setResultExtras(bundle);
Bundle bundle = getResultExtras(true); String s2 = bundle.getString("test"); System.out.println("得到的结果是:"+s2);
此时的log日志:
很显然得不到数据也就是不能够处理广播。
3.2. 发送一条有序广播
当发送普通广播的时候,接收器是不能处理广播的,但是有序广播却可以处理广播。那在activity中增加有序广播的代码:
case R.id.send2://发送一条有序广播 Intent intent2 = new Intent(); intent2.putExtra("msg", "这是一条有序广播"); intent2.setAction("BC_One"); sendOrderedBroadcast(intent2, null); break;
其他的保持不变则打印的结果为:
相关文章推荐
- android 多媒体数据库(非原创)
- Android 计算器
- Android入门篇(一)Android工程的搭建,导入与导出,图标的修改
- android-引导页的实现方式
- Android电量测试工具battery-historian学习小记
- Android控件之SurfaceView初步了解
- android的Environment类 .
- Android开发Widget之提高篇
- [android] fragment的生命周期和通讯
- Android 动效系列之一 - AndroidSwipeLayout
- 30 条 Android 开发建议 2016.3.16
- VectorDrawable 怎么玩(Android)
- Android自定义控件之onLayout
- Android studio 2.1 集成第三方短信验证类库
- Android 状态栏工具类(实现沉浸式状态栏 / 变色状态栏)
- 高效Android开发者必须知道的4个工具
- Android 服务两种启动方式的区别
- Android 自定义 View 之高仿 QQ 健康
- Android 5.0以后版本打开“有权查看使用情况的应用”
- Android Service使用拾遗[阿里工程师分享]