Android BroadcastReceiver

来源:互联网 发布:怎样退货给淘宝卖家 编辑:程序博客网 时间:2024/05/17 03:44


前面四大组件已经介绍三个了,那就差 BroadcastReceiver 了,本来打算周末去写的,但是代码在公司了,所以就今天给大家介绍以下四大组件的最后一课,BroadcastReceiver 。


一、概述

BroadcastReceiver 意思就是广播的意思,那在我们的平时生活中,如果有人发送广播的时候,当我们听到广播的时候会进行一些列的动作,那 Android 中的广播和我们生活中的广播用法大致相同,那广播我们要关注的就是两个功能,一个就是发送广播,另一个就是接受广播,那我们的 BroadcastReceiver 的作用就是广播接受者,当我们把 BroadcastReceiver 归结到我们的四大组件的时候,那我们首先想到的就是注册了,因为四大组件都需要在 AndroidManifest 中注册的,那下面我们就看一下 BroadcastReceiver 的注册方式。



二、注册方式和 BroadcastReceiver 实现


BroadcastReceiver 的注册方式分为两种,静态注册和动态注册

静态注册:

静态注册方式和我们的其他三大组件的注册方式就大概相同了,也就是我们在 AndroidManifest 中去注册,那我们看一下我们的实现方式,首先我们先编写一个 BroadcastReceiver :

public class FristReceiver extends BroadcastReceiver{        @Override    public void onReceive(Context context, Intent intent) {        String msg = intent.getStringExtra("msg");        Log.e("firstbroadcastreceiver:",msg);        Bundle bundle = new Bundle();        bundle.putInt("code",11111);        setResultExtras(bundle);    }    }


我们可以看到我们的 FristReceiver 中只有一个方法,那这个方法中只有一个方法,那这个 onReceiver 方法,那这个方法也就是我们 BroadcastReceiver 的主方法,当我们有对应的广播发送的时候,onReceiver 就会执行。好了那下面我们看一下注册的代码:

<receiver android:name=".SecondReceiver">            <intent-filter >                <action android:name="com.andya.fristReceiver"/>            </intent-filter>        </receiver>

那从这个注册中我们可以看到,我们指定了一个 action 那我们接受到的广播也是一定要与这个 action 相匹配的,一般的 action 的 name 都是包名加上 BroadcastReceiver 的名字。静态注册我们就看到这里,下面说一下动态注册


动态注册:

静态主要是在 xml 中注册我们的 BroadcastReceiver 的,那动态注册肯定就是在 java 代码中注册,BroadcastReceiver 的代码就用上面 FristReceiver 的,那下面我们看一下动态注册的代码:

fristReceiver = new FristReceiver();        tvStartActivity = (TextView)findViewById(R.id.tv_start_activity);        IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver");        registerReceiver(fristReceiver,intentFilter);

从这段代码中我们可以看到,注册需要两个变量一个是 BroadcastReceiver 一个是 IntentFilter 那这个 IntentFilter 可以 add 多个 Action 也就是我们的广播可以相应多个 Action,那我们注册的这个广播可以相应 com.andya.firstReceiver 这个 Action。


通过注册我们只是完成了广播的一部分,也就是等待功能,当有广播发送的时候,我们会用发送的广播与我们的 Action 相匹配,当匹配成功的时候,就会执行 onReceiver 的代码。

三、发送广播

注册和创建广播的基本用法我们了解的差不多了,那这一节我们主要讲的就是发送广播,那发送广播的方式也可以分为两种,一种是发送正常的广播,一种是发送有序广播。

正常广播:

当我们发送正常广播的时候,主要我们的广播和对应的 BroadcastReceiver 能匹配上,那我们的广播就会执行,也就是说他没有接受的顺序,没有中断,只要能匹配上,那就可以指定 onReceiver ,下面看一段代码:



Intent intent = new Intent("com.andya.fristReceiver");                intent.putExtra("msg","hello broadcastReceiver");                sendBroadcast(intent);


从上面的代码中可以看出当我们发送广播的时候需要申请一个 Intent,那后我们调用 sendBroadcast 方法去发送广播,这种方式很简单没有任何限制。



有序广播:

下面说一下发送有序广播,从有序这两个字中我们一定知道我们发送的这个广播一定是有接收顺序的,那我们怎么去区分哪个 BroadcastReceiver 先接收到呢,我们可以通过 setPriority 来设置广播的优先级,那这个 Priority 是一个 int 类型的值,那如果是 int 类型的值就会有限制,最大为2147483647。所以说我们的广播最高优先级是 2147483647,我们可以在注册的时候配置这个 Priority 这个值下面看代码:


IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver");        intentFilter.setPriority(3000);        registerReceiver(fristReceiver,intentFilter);


 <receiver android:name=".SecondReceiver">            <intent-filter android:priority="2000">                <action android:name="com.andya.fristReceiver"/>            </intent-filter>        </receiver>

可以看到我们配置了一个值为 2000 一个值为3000,一个为动态配置 一个为静态配置,那如果我们发送有序广播的时候一定是这个 3000 的先收到的。

其实发送有序广播很简单,我们之前是 sendBroadcast 发送的普通广播,发送有序广播只需要 sendOrderedBroadcast 就可以了,
下面看几段代码,让我们来了解一下在发送有序广播的时候我们能做什么事情。


1、首先我们配置一下 BroadcastReceiver
 <receiver android:name=".PriorityReceiver$HigthReceiver">            <intent-filter android:priority="3000">                <action android:name="com.andya.priorityreceiver"/>            </intent-filter>        </receiver>        <receiver android:name=".PriorityReceiver$LowReceiver">            <intent-filter android:priority="1000">                <action android:name="com.andya.priorityreceiver"/>            </intent-filter>        </receiver>        <receiver android:name=".PriorityReceiver$NormalReceiver">            <intent-filter android:priority="2000">                <action android:name="com.andya.priorityreceiver"/>            </intent-filter>        </receiver>

可以看到三个里面有三个优先级,下面看一下我们在 onReceiver 中的处理:

package com.example.andya.broadcastreceivertest;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.util.Log;/** * Created by andya on 2017/7/4. */public class PriorityReceiver {    public static class HigthReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            int code = 1;            String data = "hello setResultAndData";            Bundle bundle = null;            setResult(code,data,bundle);        }    }    public static class NormalReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            Log.e("NormalReceiver code:",String.valueOf(getResultCode()));            Log.e("NormalReceiver data:",String.valueOf(getResultData()));        }    }    public static class LowReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {        }    }}


从这段代码中我们可以看到我们的 HigthReceiver 中通过 setResult 设置了 data 和 code ,那在我们的 NormalReceiver 中,可以接收到我们的 data 和 code,其实也可以设置一些数据的在 Bundle 中,那也就是说我们可以通过 setResult 方法传递数据给优先级低的广播,不过这个方法只能用在有序广播中。
那有人会问我们可以阻止广播的传递么,答案是肯定的,我们如果在 HigthReceiver 中调用 abortBroadcast()方法,那么就可以阻止广播的传递。
说到注册我们一定会想到反注册,那当我们 Activity 调用 onDestory 的时候我们一定要去调用 unregisterReceiver 这个方法来反注册我们的广播。
发送广播的基本用法就说到这里,下面说一下发送本地广播的做法。


四、发送本地广播

有时候我们会有这样的需求,也就是说我们的广播只能被我们的 app 所受到,当你有这样的需求的时候,本地广播就是你最好的选择,我们的本地广播刚好能满足你的需求,也就是说当我们用本地广播发送的时候,只有我们的 app 能收到我们的广播,其他 app 是收不到的,下面看一段代码:



 IntentFilter intentFilter = new IntentFilter("com.andya.fristReceiver");        intentFilter.setPriority(3000);        fristReceiver = new FristReceiver();        localBroadcastManager = LocalBroadcastManager.getInstance(this);        localBroadcastManager.registerReceiver(fristReceiver, intentFilter);



这里面是注册的代码,可以看到我们需要通过 LocalBroadcastManager 去进行注册,下面看一下发送的代码:


Intent intent = new Intent("com.andya.fristReceiver");        localBroadcastManager.sendBroadcast(intent);

也是通过 LocalBroadcastManager  进行发送的。

通过这种方式发送的广播只有我们的 app 能收到。

总结:


最后说几点广播的注意事项吧:
1、内部类的BroadcastReceiver必须由public static修饰
2、如果内部类是 BroadcastReceiver 那么注册时候需要用 $ 把内部类名和 BroadcastReceiver 隔开

好了四大组件已经介绍完了,后面的学习主要就是 Android 的存储和绘图吧,绘图的东西感觉很多,之后会分为几篇文章介绍,本篇文章如有什么错误欢迎指出共同进步





原创粉丝点击