Android之广播机制
Android之广播机制
广播机制简介
Android提供了一套完整的API,允许应用程序自由的发送和接受广播,发送广播借助于我们之前学过的:Intent,而接收广播需要借助于广播接收器(Broadcast Receiver)
广播的类型主要分为两种:标准广播和有序广播。
标准广播:一种完全异步执行的广播,在广播发出之后,所有接收器几乎在同一时刻接收到这条广播消息,因此它们之间没有任何的先后顺序可言,这种广播的效率会比较高,但是同时也意味着它无法被截断的。标准广播的工作流程图如图所示:
有序广播: 一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所以这种广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。有序广播的工作流程如图所示:
接收系统广播
Android内置了很多的系统级别的广播,我们可以在应用程序中提通过监听这些广播来得到各种系统的状态信息。比如手机开机、电池的电量、时间或时区发生改变等情况下发出一条广播,要接受这些广播,就需要使用广播接收器。
广播接收器可以自由的对自己感兴趣的广播进行注册,注册广播的方式一般有两种,在代码中注册称为动态注册,在AndroidManifest.xml中注册称为静态注册。
动态注册监听网络变化
第一步:声明网络权限。Android系统为了保护用户设备的安全和隐私,做了严格的规定:如果程序需要进行一些对用户来说比较敏感的操纵,就必须在配置文件中声明权限才可以,否则程序将会直接崩溃。
第二步: 在MainActivity活动中创建广播接收器,并进行注册
第三步:运行程序,会弹出:network is available的提示,接着点击Home键,不要点击Back键,回到主界面后,进入设置,打开手机的飞行模式,会弹出:network is unavailable
静态注册广播接收器
动态注册的广播接收器可以自由的控制注册与注销,在灵活性方面有很大的优势,但是它有一个缺点,就是必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。为了让程序在未启动的情况下就能收到广播,就需要使用到静态注册方式了。
第一步:先创建一个广播接收器BroadCompleteReceiver,New—>Other—>Broadcast Receiver.
-
Exported:表示是否允许这个广播接收器接收本程序以外的广播
-
Enabled:表示是否启用这个广播接收器。
第二步:在创建的广播接收器中设置一个Toast显示,表示当这个广播接收器接收到消息后弹出一个提示信息。
第三步:在AndroidManifest.xml中对创建的广播接收器添加想要监听的action,并进行权限声明,注意:我们在创建BroadCompleteReceiver广播接收器的时候,系统就已经自动在AndroidManifest.xml中注册了。
Android系统启动完成后会发出一条值为:android.intent.action.BOOT_COMPLETED 的广播,因此我们在< Intent-filter>标签中添加相应的action。然后使用< user-permission>标签中又添加一条:android.permission.RECEIVE_BOOT_COMPLETED权限。
第四步:关闭模拟器再打开,就会收到一个开机广播
广播发送及广播类型
广播发送
- 广播 这一实体本身以 intent 表示
- 广播的定义 = 相应广播intent的定义
- 广播的发送:通过广播发送者将此intent发送出去,根据不同类型的广播调用相对应的send方法
广播的类型
主要分为一下四类:
- Normal Broadcast(普通广播):通常调用sendBroadcast(Intent)(Intent, String)方法发送
- System Broadcast(系统广播):发生各种事件时,系统自动发送
- Ordered Broadcast(有序广播):调用sendOrderedBroadcast(Intent, String)方法发送
- Local Broadcast(本地广播):调用LocalBroadcastManager.sendBroadcast(intent)方法发送
- ‘Sticky Broadcast’(粘性广播):已弃用(API 21)
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- Android(安卓)用系统相机拍照android.os.FileUriExposedExceptio
- 安卓反编译揭秘(爱加密系列教程九)
- 如何用Qt/C++访问Android摄像头
- 如何安装Android应用程序到sdcard上
- Kivy A to Z -- 调试篇之在Android平台调试Python代码
- Flutter教程(一) 十分钟了解Flutter
- Android(安卓)== 简单的binder通信
- Android显示原理