Android基础进阶之Broadcast(广播接受者)的学习和研究

-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;

其他的保持不变则打印的结果为:
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值