第一行代码

作者: 相忘于江湖eyu | 来源:发表于2020-02-04 07:35 被阅读0次

    —— 广播机制


    纲要

    • 广播简介
    • 广播接收
      • 动态注册
      • 静态注册
    • 广播发送
      • 标准广播
      • 有序广播
    • 本地广播
    • 最佳实践

    简介-全局大喇叭

    Android四大组件之一,为了便于进行系统级别的消息通信而引入广播机制

    比IP网络的广播消息机制更灵活

    • APP注册自己感兴趣的消息,只接收该部分广播消息(来自系统或其他APP)
    • 完整的API,自由的接收/发送

    广播两面

    • 发送广播:Intent
    • 接收广播:Broadcast Receiver

    广播分类1

    • 标准广播(Normal broadcasts):完全异步,无先后顺序无法被截断,效率高


    • 有序广播(Ordered broadcasts):同步执行,有序可被截断,效率相对低


    广播分类2

    • 系统全局广播
    • 本地广播

    接收系统广播

    接收各种系统状态信息

    注册方式

    • 动态注册:代码中注册
    • 静态注册:AndroidMainifest.xml中注册

    动态注册监听网络变化

    创建广播接收器

    创建一个继承自BroadcastReceiver的类,并重写父类的onReceive()方法即可。

    简单四步走:

    1. 声明权限
    2. 注册(增加相应过滤)
    3. 重写onReceive()实现收到消息时的处理
    4. 销毁时记得注销




    在收消息处理中如果要获取网络具体状态,调用相应系统服务和方法即可

    静态注册实现开机启动

    为何需要静态注册?
    动态注册虽然灵活,但是必须启动后才能收到广播

    快捷方式创建广播接收器,重写生成代码中的onReceive()方法即可:

    • 静态广播接收器必须在AndroidMainifest.xml中注册才可以使用(receiver标签),自动生成已经有这部分
    • exported属性表示是否接收本程序外的广播
    • enabled表示是否启用该广播接收器
    • intent-filter标签中增加对应启动action
    • 增加启动权限声明

    注意广播接收器中不允许开线程,所以onReceive()方法中逻辑不要过于复杂耗时,方法运行过长时间没结束程序会报错,因此广播接收器一般扮演打开程序其他组件(如:状态栏通知消息、启动服务等)

    发送自定义广播

    发送标准广播

    • 自定义广播接收器
      • 定义类
      • 同时在AndroidMainifest.xml中对广播接收器进行修改,指定名称以及action消息(值与发送值对应)
    • 发送自定义广播
      代码如下,发送消息值与接收器中定义一致:



      可以根据需要在Intent中带参数

    发送有序广播

    • 发送有序广播只需要改为调用sendOrderedBroadcast()方法即可:


      • 第一个参数还是Intent
      • 第二个参数是一个与权限相关的字符串
    • 广播顺序在注册时设定,在Intent-filter中增加android:priority参数指定,数越大优先级越高(取值范围:-1000~10000)
    • 广播接收器如果需要截断广播消息,只要在接收时调用abortBroadcast()方法即可

    使用本地广播

    为什么需要本地广播
    前面发送和接收的均为系统全局广播,任何应用都可以接收、也可以接收任何应用的广播,存在安全问题,故引入本地广播,保证消息只在应用程序内部收发广播。

    原理:使用LocalBroadcastManager对广播进行管理,并提供发送广播和注册广播的方法:

    • 通过localBroadcastManager的getInstance()方法获得实例
    • 注册用localBroadcastManager实例的registerReceiver
    • 发送用localBroadcastManager实例的sendBroadcast
    • 同时类似的注意注销等逻辑即可




    注意:本地广播无法通过静态注册方式接收

    优势

    • 不担心发送泄密
    • 不担心接收引起漏洞
    • 更高效

    最佳实践

    强制下线功能

    思路:任何一个界面(接收广播)--> 弹出对话框提示异地上线(点确定按钮)--> 关闭所有界面弹出登录界面

    难点:静态注册不可行(无法弹出),动态注册每个Activity注册不现实

    解决方案/技术点

    • 强制下线逻辑不是写在Activity中而是在接收器中
    • BaseActivity动态注册接收,所有Activity继承BaseActivity
    • BaseActivity onResume()注册,onPause()注销

    相关文章

      网友评论

        本文标题:第一行代码

        本文链接:https://www.haomeiwen.com/subject/tdshxhtx.html