第一行代码

作者: 相忘于江湖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