• 广播接收者BroadcastReceiver(2018年5月18日)


    前提知识

    ContextCompat上下文兼容

    ContextCompat.getDrawable
    ContextCompat.getColor

    替代
    context.getResources().getDrawable
    context.getResources().getColor

    import android.Manifest;

    Manifest.permission.RECEIVE_SMS



    1、广播接收者

    BroadcastReceiver

    使用场景:

    当手机没有电时,会告知用户“电量低”的广播信息。可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源。

    对于某某程序来说,可以选择接收这一消息也可以选择不接收这个消息。

    手机的storage不够了,提示你清理空间,否则应用程序将变慢或者无法使用。

    手机一开机,某某程序就自动运行,QQ、微信都是开机自启。

    原理:

    一个程序发出广播信息,一个程序接收广播信息,所以至少需要2个程序才能完成一发一收。发的一方,叫广播发送方;收的一方,叫广播接收者。

    例如使用receiver可以接收短信拦截它。

    如何实现:

    1)接收什么广播

    是指广播的消息是什么,需要接收者关注什么广播频道

    2)接收到广播后做什么?

    重写onReceive()方法,表示收到广播就做什么

    3)需要定义一个继承于BroadcastReceiver的类。

    【案例】收到短信,响应它。

    步骤:

    1)继承BroadcastReceiver,重写onReceive方法

    2)注册BroadcastReceiver,且设置广播的action

    3)权限的设置,分为动态权限和静态权限

    项目结构:

     

    MyReceiver.java

     

    AndroidManifest.xml

     

    MainActivity.java

     

    测试:

     

    Log日志:

     

    2、有关广播接收者的分类

    有关广播:按是否有序分类:有序广播和无序广播

    有序广播是指:接收者A收到广播后传给BB传给C,有序传递。任何一个环节都可以终止广播,也可以修改广播中携带的数据。

    发送广播的方法是:sendOrderedBroadcast()

    无序广播是指:一个广播发送者,向所有接收者同时发送广播,也就是ABC接收者都同时响应。

    发送广播的方法是:sendBroadcast()

    有关广播接收者:按是否常驻分类:常驻型广播接收者和非常驻型广播接收者

    常驻型广播接收者:在androidManifest.xml中注册,只要应用程序没有被卸载就持续存在。

    非常驻型广播接收者:在java代码中注册,一般随Activity或者Service组件产生而产生,随他们销毁而销毁。生命周期比较短。使用的方法是registerReceiver(参数1:广播接收者实例,参数2:频道(意图过滤器));unregisterReceiver(广播接收者实例)

    3、如何发送广播?

    实现的步骤:

    1)需要设置一个意图,意图中包含广播的频道,也就是有action,这个action相当于广播中的频道,关联了收和发广播双方,发从什么频道发出去,收从什么频道接收来。

    2)使用sendBroadcast(intent),表示发送广播。

    Sender Module

     

    activity_main.xml

    MainActivity.java

     

    Receiver Module:

     

    MyReceiver.java

     

    androidManifest.xml

     

    效果:

    点击

    receiver中显示日志

    日志为:

    4、如何发送有序广播?

    有序广播,又叫同步广播,接收者依次收到广播,这个顺序取决于接收者在注册时设置priority(优先级),该数字越大表示优先级越高,代表越先收到广播。有序广播对于接收者来说,效率较低,因为有先后顺序。

    无序广播,异步执行,各自执行各自的响应,互相不干扰,效率较高。

    Sender Module:

    修改activity_main.xml

    修改MainActivity.java

    Receiver Module:

    MyOrderedReceiver1.java

    MyOrderedReceiver2.java

    MyOrderedReceiver3.java

    androidManifest.xml

    测试:

    点击发送有序广播,依次响应。

    注意:

    1)如果多个接收者priority一样,在前面注册的先接收消息,先做出响应

    2)也可以在某个receiver上终止广播,后面的receiver就收不到消息了。使用abortBroadcast()方法。

    5、如何在有序广播中传递数据?

    发送有序广播时需要指定参数

    public abstract void sendOrderedBroadcast(Intent intent, String permission, BroadcastReceiver receiver, Handler handler, int code, String data, Bundle bundle);

    intent,通过意图,指定广播的频道

    permission,表示必须具备什么权限才能接收的接收者,null表示不需要限定权限

    receiver,指定某一个接收必须接收(即使碰到abortBroadcast,也接收)

    handler,系统的处理者,实现线程通信

    code,表示广播的状态码

    data,表示原始数据,可以用于传递数据

    bundle,是一组数据,可以包含很多数据

    【案例】发送带有数据的广播

    sender2 module

     

    activity_main.xml:

     

    MainActivity.java

     

    Receiver2 Module:

     

    MyReceiver1.java

     

    MyReceiver2.java

     

    MyReceiver3.java

     

    AndroidManifest.xml

     

    效果:

    依次收到数据

    6、发送有序广播中,修改传递的数据

    在接收者中调用setResultDataString)方法对字符串数据进行修改;

    在接收者中调用setResultExtra(bundle)方法对bundle数据进行修改

    sender3 Module

     

    activity_main.xml

     

    MainActivity.java

     

    Receiver3 Module:

     

    MyReceiver1.java

     

    MyReceiver2.java

     

    MyReceiver3.java

     

    androidManifest.xml中注册。

    测试如下:

    【作业】

    实现有序广播及接收者(2个),接收者根据广播信息传递不同数据,如广播消息“没有电了”,接收者1回应“保存数据,完成第一步”,接收者2回应“保存数据,完成第二步”。如果广播消息是“没有信号”,接收者1回应“连接基站,完成第一步”,接收者2回应“连接基站,完成第二步”。

      

  • 相关阅读:
    C++学习(c++17)——2.X.使用string和string_view
    C++学习(c++17)——1.3一个小程序(part2.Datebase类)
    论++i + ++i + ++i
    C++学习(c++17)——1.3 一个小程序(part1.Employee类)
    C++学习(c++17)——1.2 稍微深入研究C++
    VS2019社区版关于Qt的设置
    C++学习(c++17)——1.1 C++基础知识
    2020杭电多校第五场
    2020杭电多校第四场
    2020杭电多校第三场
  • 原文地址:https://www.cnblogs.com/sanshengshitouhua/p/14581112.html
Copyright © 2020-2023  润新知