Android学习之基础知识八—Android广播机制

1、广播机制简介android

  Android提供了一套完整的API,容许应用程序自由的发送和接受广播,发送广播借助于咱们以前学过的:Intent,而接收广播须要借助于广播接收器(Broadcast Receiver)安全

  广播的类型主要分为两种:标准广播和有序广播。网络

  标准广播:一种彻底异步执行的广播,在广播发出以后,全部接收器几乎在同一时刻接收到这条广播消息,所以它们之间没有任何的前后顺序可言,这种广播的效率会比较高,可是同时也意味着它没法被截断的。标准广播的工做流程图如图所示:异步

  有序广播:一种同步执行的广播,在广播发出以后,同一时刻只会有一个广播接收器可以接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,因此这种广播接收器是有前后顺序的,优先级高的广播接收器就能够先收到广播消息,而且前面的广播接收器还能够截断正在传递的广播,这样后面的广播接收器就没法收到广播消息了。有序广播的工做流程如图所示:spa

2、接收系统广播3d

  Android内置了不少的系统级别的广播,咱们能够在应用程序中提经过监听这些广播来获得各类系统的状态信息。好比手机开机、电池的电量、时间或时区发生改变等状况下发出一条广播,要接受这些广播,就须要使用广播接收器。code

  广播接收器能够自由的对本身感兴趣的广播进行注册,注册广播的方式通常有两种,在代码中注册称为动态注册,在AndroidManifest.xml中注册称为静态注册。xml

2.1  动态注册监听网络变化对象

第一步:声明网络权限。Android系统为了保护用户设备的安全和隐私,作了严格的规定:若是程序须要进行一些对用户来讲比较敏感的操纵,就必须在配置文件中声明权限才能够,不然程序将会直接崩溃。这里访问的是系统的网络状态,因此须要进行如下权限声明。blog

 

第二步:

 在MainActivity活动中建立广播接收器,并进行注册

第三步:运行程序,会弹出:network is available的提示(左),接着点击Home键,不要点击Back键,回到主界面后,进入设置,打开手机的飞行模式,会弹出:network is unavailable(右)

      

 2.2  静态注册广播接收器

  动态注册的广播接收器能够自由的控制注册与注销,在灵活性方面有很大的优点,可是它有一个缺点,就是必需要在程序启动以后才能接收到广播,由于注册的逻辑是写在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权限。

第四步:关闭模拟器再打开,就会收到一个开机广播

 

3、发送自定义广播

   前面咱们提到广播有两种类型:标准广播和有序广播

3.1  发送标准广播

 第一步:建立一个自定义广播接收器,用于接收到广播后执行的操做

第二步:在AndroidManifest.xml中注册:MyReceiver广播接收器(已自动注册),给发送的广播自定义一个值:

<action android:name="com.workspace.hh.broadcasttest.MY_RECEIVER"/>

第三步:在activity_main.xml中设置一个按钮,经过点击按钮来发送自定义的广播

第四步:在MainActivity的:onCreate()方法中为按钮设置监听事件:

  发送广播时,先建立一个Intent对象,把须要发送的广播的值传入,而后调用:context的sendBroadcast()方法,把广播发送出去。这样全部监听:com.workspace.hh.broadcasttest.MY_RECEICER 这条广播的广播接收器就会收到消息。

第五步:运行程序,点击按钮发送广播

3.2  广播跨进程通讯

   广播时一种能够跨进程的通讯方式,所以咱们在应用程序内发出的广播,在其余应用程序也能收到,下面咱们就来看一下效果:

第一步:新建一个项目:BroadcastTest2,并自定义一个广播接收器:AnotherBroadcastReceiver,而后在AndroidManifest.xml中添加要监听的广播的值:com.workspace.hh.broadcasttest.MY_RECEIVER

第二步:运行项目BroadcastTest2,而后在BroadcastTest项目程序中点击按钮,能够看到前后弹出来两个提示信息,这说明两个应用程序都接收到了广播

    

3.3  发送有序广播

  发送有序只须要修改一个地方就好了:将:sendBroadcast()改成:sendOrderedBroadcast().  

  sendOrderedBroadcast()方法接收两个参数:一个是Intent,另外一个是与权限相关的字符串,这里传入null就好了。

  修改这个地方事后,虽然发送的广播已是有序广播了,可是效果仍是与标准广播同样会弹出两个提示信息,下面咱们来经过截断广播看效果:

第一步:给:MyReceiver广播接收器设置优先级,使得:MyReceiver比其余广播接收器先接收到广播,在AndroidManifest.xml中经过:android:priority  属性给广播接收器设置优先级

第二步:在MyReceiver广播接收器中截断广播,及后面的接收器就接收不到广播了,在Toast提示信息下面添加:abortBroadcast()方法,该方法表示在此截断广播,后面的广播接收器就再也接收不到该广播了。

第四步:从新运行BroadcastTest和BroadcastTest2这两个程序,而后点击BroadcastTest程序中的按钮,咱们看到只有一条提示信息弹出来:received in myReceiver

 

4、 使用本地广播

  前面咱们发送和接收的广播都是属于系统全局广播,即发出的广播能够被其余应用程序接收到,而且咱们也能够接收来自于其余应用程序的广播。这样就很容易引发安全性问题,好比说

咱们发送的一些携带关键性数据的广播有可能被其余应用程序截获,或者其余应用程序不停的向咱们的广播接收器发送各类垃圾广播。

  为了解决广播的安全性问题,Android提供了一套本地的广播机制,使用这个机制发出的广播只能在应用程序的内部传递,而且广播接收器也只能接收来自本应用程序发出的广播,这样全部的安全性问题就不存在了。

 第一步:修改MainActivity活动中的代码:

第二步:运行程序,点击按钮,就会弹出:received local Broadcast  的提示信息。若是咱们在BroadcastTest2这个应用程序中也去接收这条广播,很明显是接收不到的,由于这条广播只在BroadcastTest程序中传播。

 

本地广播的注意事项:

  本地广播是没法经过静态注册的方式来接收的,由于静态注册主要是为了让程序在未启动的状况下也能接收到广播,而发送本地广播时,咱们的程序确定是已经启动了,所以彻底不须要使用静态注册的功能。

本地广播的几点优点:

  一、能够明确地知道正在发送的广播不会离开咱们的应用程序,所以没必要担忧机密数据泄漏

  二、其余程序没法将广播发送到咱们程序的内部,所以不须要担忧会有安全漏洞的隐患

  三、发送本地广播比发送系统全局广播将会更加高效

相关文章
相关标签/搜索