Android开发小知识-BroadCastReceiver的使用

须知

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方法后,该接收器对象被销毁!下次接收时,重新实例化接收器对象!(留给爱动手的你去测试啦 -_-)

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值