• Android四大组件之BroadcastReceiver


    什么是BroadcastReceiver?

          BroadcastReceiver(广播接收器),顾名思义,是用来接收广播的。Android内部实现了一套广播通信机制,即在某个应用或某个组件注册广播接收器,接收特定类型的广播。当别的应用或组件发送该类型的广播时,注册广播接收器的组件或应用就能接收到该广播,并执行相应的操作,这非常类似于观察者模式。

    如何使用BroadcastReceiver?

          BroadcastReceiver使用起来非常简单,我们只需要先自定义一个广播接收器,然后在想要接收广播的组件中注册该广播接收器。当别的组件发送广播的时候,广播接收器就能收到该广播,然后执行相应的操作就可以了。下面将一步步介绍广播接收器的具体使用方法。

    1.自定义广播接收器:

          自定义广播接收器的方法很简单,我们只需要创建一个自定义类继承BroadcastReceiver,并实现onReceive()方法

    public class MyBroadcastReceiver extends BroadcastReceiver {
    
        //需要实现的方法
        @Override
        public void onReceive(Context context, Intent intent) {
    
        }
    }

          onReceive()方法就是当广播接收器接收到广播后会执行的方法,我们可以看到它会接收到一个Intent,这个Intent就是发送广播时传过来的Intent对象,我们可以在onReceive()中获取Intent传来的额外数据,并进行处理。

    2.注册广播接收器

          创建了自己的广播接收器后,我们就可以在需要接收广播的地方进行注册。注册广播的方式有两种:静态注册和动态注册。

          静态注册广播需要我们在AndroidManifest中去注册广播接收器,它的特点是该广播接收器一旦注册后将会一直存在,并且监听广播,即使我们退出了应用,广播接收器仍然可以接收广播,并触发onReceive()方法。静态广播的使用也比较广泛,比如一个公司里有多个App产品,通过静态注册的广播接收器,就能够实现一个App启动其他的App。

        <application>   
              ...
            <receiver android:name=".widget.MyBroadcastReceiver">
                <intent-filter>
                    <action android:name="com.weimore.example.MY_BROADCAST"/>
                </intent-filter>
            </receiver>
              ...
        <application/>

          如上,我们注册广播接收器,首先指定是哪一个广播接收器,在receiver标签写上我们之前自定义的广播接收器的类名即可。然后在里面添加一个intent-filter(过滤器)用来过滤广播,intent-filter里的action指定了我们所要接收的广播,如果对intent-filter不了解的,可以去看看我写的关于intent的一篇博客。当其他地方发出广播时,我们会对比其传递的intent中的action,如果intent中的action与注册广播接收器时intent-filter中指定的action一致,则接收此广播,这样就起到了广播过滤的作用。

          动态注册广播和静态注册一样,需要知道使用的广播接收器,以及需要一个Intent-filter用来过滤广播,Intent-filter中同样需要传入一个action,用来指定要接收的广播,最后使用registerReceiver()注册广播即可。代码如下:

       //自定义的广播接收器
    MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); //过滤器,其中传入一个action
    IntentFilter filter
    = new IntentFilter("com.weimore.example.MY_BROADCAST"); //注册广播
    registerReceiver(mReceiver,filter);

           解注册广播:

       //解注册
    unregisterReceiver(mReceiver);

          我们用Activity动态注册和解注册BraodcastReceiver时,最好在onResume()方法和onPause()方法中进行注册和解注册。因为不处于交互状态的Activity本来就没有必要去接受和处理广播。

          这样广播接收器就算是注册完成了,接下来只要等待其他应用或组件发送广播。然后进行接收就可以了。发送广播的方法也很简单,通过调用sendBroadcast()方法,并传入一个 intent 即可。

      //创建Intent对象
      Intent intent = new Intent();
      //指定action
      intent.setAction("com.weimore.example.MY_BROADCAST");
      //发送广播
      sendBroadcast(intent);

          广播发送后,我们注册的广播接收器就能接收到广播,并调用接收器中的onReceive()方法,整个广播的发送与接收流程也就完成了。要注意的是,静态注册广播接收器的特点是即使应用销毁后也会接收广播,而动态注册广播接收器则相反,它的生命周期十分短暂,大概在10秒左右。每次当有匹配的广播发送过来时,它会创建BroadcastReceiver,并执行里面的onReceive()方法,然后10秒左右就会被销毁,所以我们在onReceive()方法种尽量不要进行太长的耗时操作。此外,我们也最好不要再BroadcastReceiver中创建子线程进行耗时操作,因为BroadcastReceiver在执行onReceive()结束任务后,它的进程优先级会处于空进程的优先级,随时随地会被系统给回收销毁,而依赖于该进程的子线程也会随即被销毁。所以最好的处理方法是在onReceive()中启动Service,将耗时操作交给Service去处理。

    其他的Broadcast

          上面所介绍的广播属于标准广播,该种广播一旦发送,只要是action能够匹配的BroadcastReceiver都能够接收到广播。除了该类型的广播之外,我们还能够发送有序广播,本地广播等。

          有序广播是指当广播发送后,会根据广播接收器的优先级进行顺序传递。比如有两个广播接收器都能够匹配该广播,但一个的优先级为100,而另外一个的优先级为50,则广播为先传递到优先级高的那个广播接收器,该广播接收器接收到广播后,可以对广播进行拦截,这样后面的广播接收器就无法接收到该广播了,如果不做拦截,则会继续按优先级大小发送广播。

          有序广播的使用也很简单,将之前的sendBroadcast()方法变为sendOrderedBroadcast()就可以了。

    //第二个参数表示接收器接收该广播所需要的权限,一般传null即可
    sendOrderedBroadcast(intent,null);

          设置广播接收器的优先级主要是在Intent-filter中设置的。静态注册和动态注册给广播接收器设置优先级的方法分别如下:

       //静态注册
    <receiver android:name=".widget.MyBroadcastReceiver"> <intent-filter android:priority="100"> //设置优先级 <action android:name="com.weimore.example.MY_BROADCAST"/> </intent-filter> </receiver>
       //动态注册   
    IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST"); filter.setPriority(100);

          如果某个广播接收器想要拦截该广播,只需要在onReceive()方法中调用abortBroadcast()方法就可以了。

    @Override
        public void onReceive(Context context, Intent intent) {
            //拦截广播
            abortBroadcast();
        }

         

          本地广播和标准广播以及有序广播有些许不同,它是使用LocalBroadcastManager来发送广播以及注册广播接收器的。本地广播的优点是它发出的广播只会在应用程序的内部传播,不用担心广播被其他应用接收,造成数据泄漏,而广播接收器也只能接收到自己应用发出的广播,不会接收别的应用发来的广播,防止接收垃圾信息。具体使用如下:

        //得到LocalBroadcastManager实例
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        mReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter("com.weimore.example.MY_BROADCAST");
        //注册广播接收器
        manager.registerReceiver(mReceiver,filter);
        //得到LocalBroadcastManager实例
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        Intent intent = new Intent();
        intent.setAction("com.weimore.example.MY_BROADCAST");
        //发送本地广播
        manager.sendBroadcast(intent);

          

     

  • 相关阅读:
    A计划
    edu_6_4_1
    edu_6_2_2
    edu_6_3_1
    hdu 1205 吃糖果【鸽巢原理】
    float 为什么不能用== ,或者大于等于,或者小于等于
    素数筛法及其优化
    hdu 1106 排序
    hdu 1164 Eddy's research I
    java 格式化输出 printf 总结
  • 原文地址:https://www.cnblogs.com/weimore/p/7858640.html
Copyright © 2020-2023  润新知