您的位置:首页 > 移动开发 > Android开发

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发送一条普通广播

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;


其他的保持不变则打印的结果为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: