广播机制

2016年04月25日

一、广播机制简介
* Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。
  发送广播可以借助Intent。
  接收广播则需要广播接收器(Broadcast Receiver)。
  广播类型:标准广播;有序广播。
*  

1.1、标准广播(Broadcast Receiver)
    - 是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收这条广播消息,因此他们之间没有任何先后顺序可言。
    - 这种广播的效率会比较高,但同时也意味着他是无法被截断的。
    ![标准广播工作流程](/public/img/android/标准广播工作流程.png)


1.2、有序广播(Normal broadcast)
    - 是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。
    - 所以此时广播是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。         ![有序广播工作流程](有序广播工作流程.png)
二、接收系统广播
* Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。比如手机开机完成/电池的电量变化...后会发出一条广播 *

2.1、 动态注册监听网络变化
    - 广播接收器可以自由地对自己感兴趣的广播进行注册,这样当有相应的广播发出时,广播接收器就能够收到该广播,并在内部处理相应的逻辑。
    - 注册广播的方式有两种:
        - 在代码中注册(动态注册)
        - 在AndroidManifest.xml中注册(静态注册)

2.2、 静态注册实现开机启动
    - 动态注册优点:的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势
    - 动态注册缺点:即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中
    - 静态注册的方式可以让程序在未启动的情况下就能接收到广播。
三、发送自定义广播
3.1、发送自定义(标准)广播

3.2、发送有序广播
    - 广播是一种可以跨进程的通信方式,因此在我们应用程序内发出的广播,其他的应用程序应该也可以收到的。

3.3、使用本地广播
    - 我们在前两节使用的都是属于系统全局广播,这样就很容易引起安全性问题,比如我们发送的一些携带关键性数据的广播有可能被其他的应用程序截获,或者收到其他程序发来的各种垃圾广播。
    - 基于上述问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播。
    - 本地广播是无法通过静态注册的方式来接收的,因为静态注册主要就是为了让程序在未启动的情况下也能收到广播,而发送本地广播时,我们的程序肯定是已经启动了,因此也完全不需要使用静态注册功能。
    - 本地广播优势:
        - 1) 可以明确地知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄露的问题;
        - 2) 其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患;
        - 3) 发送本地广播比起发送全局广播将会更加高校。
四、广播的最佳实践–实现强制下线功能