Android开发小知识-BroadCastReceiver的使用

来源:互联网 发布:全国社区网络春晚 编辑:程序博客网 时间:2024/05/16 17:04

须知

1、广播接收器是用来接收系统或自己发出的广播,然后做出响应的。
2、广播分为普通广播和有序广播(和普通广播不同的是,它的接收器根据级别不同,接收到广播的顺序是不同的,级别高的先接收到广播,并有能力阻止该广播向下传递)。
3、广播接收器需要注册(Android的四大组件都是需要注册的),注册分为静态和动态两种。
静态:在AndroidManifest.xml文件中注册。
动态:通过Java代码进行注册。

普通广播测试小例子

1、自定义广播接收器类,继承系统的BroadcastReceiver类,并覆写onReceive()方法。

package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverOne extends BroadcastReceiver {    public ReceiverOne() {        System.out.println("ReceiverOne --> 构造函数被调用!");    }    //当接收到广播后,会执行该方法。我们可以在这里进行数据的相关操作    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        System.out.println("ReceiverOne --> onReceive函数被调用!");    }}

2、注册
a)静态注册,在AndroidManifest.xml文件中配置。

    <activity android:name=".MainActivity"></activity>        <!--BroadCastReceiver注册方式            name 指定该接收器对应类名称,            enable 是否能被实例化,true则可以被实例化,false则不能,            exported 是否能接受其他应用或系统的广播,true则可以接收,false则不能,            receiver是和activity处于同一级别,都是application的子标签。        -->      <receiver            android:name=".ReceiverOne"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="com.mindto.sendNormalAction"/>            </intent-filter>      </receiver>

b)动态注册,在Activity中使用代码注册。

//注册广播,这里的receiverOne和filter是成员变量名称,后面会给出完整代码System.out.println("广播接收器已经注册!");//实例化接收器receiverOne = new ReceiverOne();//实例化过滤器filter = new IntentFilter(MyIntentAction.ACTION_NORMAL);//注册registerReceiver(receiverOne, filter);

注意:动态注册的接收器,需要手动解除,我们一般在活动退出时,进行解除。

//在退出程序的时候解除注册    @Override    protected void onDestroy() {        unregisterReceiver(receiverOne);        System.out.println("广播接收器已经解除!");        super.onDestroy();    }

3、其他类代码
MainActivity.java

package com.mindto.broadcastreceiverdemo;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    //定义控件    private Button sendNormal;    private Button sendOrder;    //广播接收器,用于动态代码注册    private ReceiverOne receiverOne = null;    //广播过滤器    private IntentFilter filter = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //实例化控件(需要在setContentView(R.layout.activity_main)之后进行)并设置监听器        //实例化监听器对象        MyBtnOnClickListener btnOnClickListener = new MyBtnOnClickListener();        sendNormal = (Button) findViewById(R.id.normal);        sendNormal.setOnClickListener(btnOnClickListener);        sendOrder = (Button) findViewById(R.id.order);        sendOrder.setOnClickListener(btnOnClickListener);        //注册广播        System.out.println("广播接收器已经注册!");        receiverOne = new ReceiverOne();        filter = new IntentFilter(MyIntentAction.ACTION_NORMAL);        registerReceiver(receiverOne, filter);    }    //在退出程序的时候解除注册    @Override    protected void onDestroy() {        unregisterReceiver(receiverOne);        System.out.println("广播接收器已经解除!");        super.onDestroy();    }    /**     * 定义按钮监听器类,处理按钮的点击事件     */    class MyBtnOnClickListener implements View.OnClickListener{        //定义Intent        Intent intent = null;        @Override        public void onClick(View v) {            //点击按钮后进行Intent的实例化            intent = new Intent();            switch (v.getId()){                //当点击发送普通广播按钮后                case R.id.normal:                    //设置action                    intent.setAction(MyIntentAction.ACTION_NORMAL);                    //发送普通广播                    MainActivity.this.sendBroadcast(intent);                    break;                //当点击发送有序广播按钮后                case R.id.order:                    //设置action                    intent.setAction(MyIntentAction.ACTION_ORDER);                    //发送有序广播,第二个参数为该广播使用的权限                    MainActivity.this.sendOrderedBroadcast(intent, null);                    break;            }        }    }}

MyIntentAction.java(主要放一些使用到的字符串,提高重用性)

package com.mindto.broadcastreceiverdemo;/** * Created by mindto on 2016/3/8. */public class MyIntentAction {    //发送普通广播action    public static final String ACTION_NORMAL= "com.mindto.sendNormalAction";    //发送有序广播action    public static final String ACTION_ORDER= "com.mindto.sendOrderAction";}

4、测试结果
运行界面
运行界面图
点击一次(注意这里是点击一次)普通广播按钮后,logcat中输出内容为
点击普通广播按钮后
我们会发现输出存在异常:最后两行多余!发送了一条广播(这是可以在代码中确定的),但是却出现了两次接收的情况!原因是自己粗心,没有把静态注册的相关代码删除!这就提醒我们:静态注册和动态注册选择一个就好!
删除静态注册代码后,点击一次,发现输出正常!
删除静态注册代码后
自此普通广播测试完毕!

有序广播测试小例子

1、有序广播的测试需要多个接收器的参与,这样才能分出级别!我们需要实现多个接收器类。只需要在上例基础之上,添加接收器类,然后注册即可!
2、改动的代码
ReceiverTwo.java

package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverTwo extends BroadcastReceiver {    public ReceiverTwo() {        System.out.println("ReceiverTwo --> 构造函数被调用!");    }    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        System.out.println("ReceiverTwo --> onReceive函数被调用!");    }}

ReceiverThree.java

package com.mindto.broadcastreceiverdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class ReceiverThree extends BroadcastReceiver {    public ReceiverThree() {        System.out.println("ReceiverThree --> 构造函数被调用!");    }    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        System.out.println("ReceiverThree --> onReceive函数被调用!");    }}

MainActivity.java(在上面的同名文件中有改动,下面用加粗显示)

package com.mindto.broadcastreceiverdemo;import android.content.Intent;import android.content.IntentFilter;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;public class MainActivity extends AppCompatActivity {    //定义控件    private Button sendNormal;    private Button sendOrder;    //广播接收器,用于动态代码注册    private ReceiverOne receiverOne = null;    /***************下面两行改动*******************/    private ReceiverTwo receiveTwo = null;    private ReceiverThree receiverThree = null;    //广播过滤器    private IntentFilter filterOne = null;    /***************下面两行改动*******************/    private IntentFilter filterTwo = null;    private IntentFilter filterThree = null;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //实例化控件(需要在setContentView(R.layout.activity_main)之后进行)并设置监听器        //实例化监听器对象        MyBtnOnClickListener btnOnClickListener = new MyBtnOnClickListener();        sendNormal = (Button) findViewById(R.id.normal);        sendNormal.setOnClickListener(btnOnClickListener);        sendOrder = (Button) findViewById(R.id.order);        sendOrder.setOnClickListener(btnOnClickListener);        //注册广播        System.out.println("开始注册广播接收器!");        receiverOne = new ReceiverOne();        filterOne = new IntentFilter(MyIntentAction.ACTION_ORDER);        filterOne.setPriority(100);        registerReceiver(receiverOne, filterOne);        /***************下面八行改动*******************/        receiveTwo = new ReceiverTwo();        filterTwo = new IntentFilter(MyIntentAction.ACTION_ORDER);        filterTwo.setPriority(80);        registerReceiver(receiveTwo, filterTwo);        receiverThree = new ReceiverThree();        filterThree = new IntentFilter(MyIntentAction.ACTION_ORDER);        filterThree.setPriority(60);        registerReceiver(receiverThree, filterThree);        System.out.println("广播接收器注册完成!");    }    //在退出程序的时候解除注册    @Override    protected void onDestroy() {        unregisterReceiver(receiverOne);        unregisterReceiver(receiveTwo);        unregisterReceiver(receiverThree);        System.out.println("广播接收器解除完成!");        super.onDestroy();    }    /**     * 定义按钮监听器类,处理按钮的点击事件     */    class MyBtnOnClickListener implements View.OnClickListener{        //定义Intent        Intent intent = null;        @Override        public void onClick(View v) {            //点击按钮后进行Intent的实例化            intent = new Intent();            switch (v.getId()){                //当点击发送普通广播按钮后                case R.id.normal:                    //设置action                    intent.setAction(MyIntentAction.ACTION_NORMAL);                    //发送普通广播                    MainActivity.this.sendBroadcast(intent);                    break;                //当点击发送有序广播按钮后                case R.id.order:                    //设置action                    intent.setAction(MyIntentAction.ACTION_ORDER);                    //发送有序广播,第二个参数为该广播使用的权限                    MainActivity.this.sendOrderedBroadcast(intent, null);                    break;            }        }    }}

3、运行测试
点击一次有序广播后,logcat输出内容:
这里写图片描述
根据动态注册代码,级别高的先接受到广播。
下面在ReceiverTwo.java中的onReceive()方法中添加

//终止广播的向下传送abortBroadcast();

再次运行,点击有序广播后,logcat输出内容为:
这里写图片描述
发现ReceiverThree的onReceive方法并没有调用,说明级别高的接收器可以阻止广播向下传递!

总结

1、动态注册和静态注册,选择一个就OK,过而不及!
2、静态注册的广播接收器,每接收一个广播,执行onReceive方法后,该接收器对象被销毁!下次接收时,重新实例化接收器对象!(留给爱动手的你去测试啦 -_-)

该篇结束,若有不足,望不吝赐教!

0 0
原创粉丝点击