Android 广播接收器 BroadcastReceiver 注册、注销、优先级、拦截



BroadcastReceiver也就是广播接收者的意思,顾名思义,它就是用来接收来自系统和应用中的广播。

Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:

BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。

要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。

 

创建一个新工程LearnBroadcastReceiver,一个空Activity

广播接收器MyReceiver

用于显示Intent调用

 

MyReceiver1

隐式Intent

拦截广播

MyReceiver2

隐式Intent

实现主动注册也注销,拦截广播

创建一个MyReceiver, MyReceiver1, MyReceiver2 广播接收类扩展至
 
public class MyReceiver extends BroadcastReceiver {

    public MyReceiver() {

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("0个广播接收器接收到消息是:====="+intent.getStringExtra("data"));

  

    }

}

 

public class MyReceiver1 extends BroadcastReceiver {

    public MyReceiver1() {

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("1个广播接收器接收到消息是:"+intent.getStringExtra("data"));

        if (intent.getStringExtra("isLanJie").equals("TRUE")) {

            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息

        }

  

        }

}

 

public class MyReceiver2 extends BroadcastReceiver {

    public static final String ACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2";

    public MyReceiver2() {

  

    }

  

    @Override

    public void onReceive(Context context, Intent intent) {

        System.out.println("2个广播接收器接收到消息是:" + intent.getStringExtra("data"));

        if (intent.getStringExtra("isLanJie").equals("TRUE")){

            abortBroadcast();  //拦截广播,不让优先级别低的接收该到消息

  

        }

  

    }

}

 

修改androidManifest.xml中广播接收器

<receiver

    android:name=".MyReceiver"

    android:enabled="true"

    android:exported="true" >

  

</receiver>

  

  <!--<receiver android:name=".MyReceiver2" >-->

    <!--<intent-filter>-->

        <!--<action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />-->

    <!--</intent-filter>-->

<!--</receiver>-->

  

  <receiver

    android:name=".MyReceiver1"

    android:enabled="true"

    android:exported="true" >

    <intent-filter android:priority="1">

        <action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />

    </intent-filter>

</receiver>

 

 

在创建完我们的MyReceiver2之后,还不能够使它进入工作状态,我们需要为它注册一个指定的广播地址。没有注册广播地址的BroadcastReceiver就像一个缺少选台按钮的收音机,虽然功能俱备,但也无法收到电台的信号。

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    Button bSend;

    private  MyReceiver2 myReceiver2=null;

  

  

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

  

        bSend=(Button) findViewById(R.id.btnSendMsg);

        bSend.setOnClickListener(this);

        findViewById(R.id.btnReg).setOnClickListener(this);

        findViewById(R.id.btnUnReg).setOnClickListener(this);

        findViewById(R.id.btnsendYinShi).setOnClickListener(this);

    }

  

    @Override

    public void onClick(View v) {

        switch (v.getId()){

            case R.id.btnSendMsg:

                //发送消息

                Intent intent=new Intent(this,MyReceiver.class);

                intent.putExtra("data", "消息来自czg");

                sendBroadcast(intent);

                break;

  

            case R.id.btnsendYinShi:

                //没有自动注册的广播接收器自能用隐式的Intent进行创建(没有告诉要发送给哪个接收器,所有的接收器都可以接受到,优先级比较高的接收器可以根据需要拦截后面接收的的接收)

                Intent intent2=new Intent(MyReceiver2.ACTION);

                intent2.putExtra("data","消息来自czg");

                CheckBox cb= (CheckBox) findViewById(R.id.checkBox);

                if (cb.isChecked()==true){

                    intent2.putExtra("isLanJie","TRUE");

                }else {

                    intent2.putExtra("isLanJie","FALSE");

                }

  

                //sendBroadcast(intent2);

                sendOrderedBroadcast(intent2, null); //发送可以被拦截的广播,第二个参数可以指定权限

                break;

            case R.id.btnReg:  //注册

                if (myReceiver2==null){

                    myReceiver2=new MyReceiver2();

                    registerReceiver(myReceiver2,new IntentFilter(MyReceiver2.ACTION));

  

                }

                break;

            case R.id.btnUnReg:  //注销

                if (myReceiver2!=null){

                    unregisterReceiver(myReceiver2);

                    myReceiver2=null;

  

                }

                break;

        }

    }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵手生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值