码迷,mamicode.com
首页 > 其他好文 > 详细

第五章 全局大喇叭,详解广播机制

时间:2016-06-11 18:51:45      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:

我们晓得的是网络通信中一个IP地址段最大的IP地址为广播地址。例如,某个网路的IP地址为192.168.0.XXX,他的子网掩码为255.255.255.0,那么这个网络的IP地址为192.168.0.255。

Android也有相应的广播机制,本章将详细介绍相关细节。

1、广播机制简介

  • Android的广播机制由广播、广播接收器(Broadcast Receiver)和广播发送的内容组成;
  • 每个应用程序都可以对自己感兴趣的广播进行注册,这意味着该程序只会接受自己"感兴趣"的广播内容;
  • Android提供一套完成的API,它允许程序自由的发送和接受广播。
  • 发送广播我们之前提到过,Intent,而接受广播是由广播接收器(Broadcast Receiver)完成的

广播的类型:

  • 标准广播:(Normal broadcasts)一种完全异步执行的广播,在广播发出后,几乎所有的广播接收器同时受到这条消息。这意味着这种广播效率较高,但是呢,他无法被截断和控制。工作流程如下

????技术分享

  • 有序广播:(Ordered braoadcasts)一种同步执行的广播。在广播发送后,同一时间只有一个广播能够接受到广播内容,当这个广播处理完自己的逻辑后,才可能会传递给下面的广播。
    • 上面的话意味着广播接收器是由先后顺序的,即广播接收器是有优先级的概念
    • 广播接收器可以拦截广播消息
    • 工作流程:技术分享

    ?

2、接受系统广播

需要明白的是,Android系统内置了很多系统广播,他们在不断的放松广播消息。比如,手机一开机发送一条广播,手机电量低发送一条广播。

那么,如何使用广播接收器接收系统广播呢?

2.1 动态注册监听网络变化

????注册广播的方式一般有两种,在代码中注册和在AndroidManifest.xml中注册,其中前者也被称为动态注册,后者也被称为静态注册。

????那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。

?

技术分享

这段代码是简单的创建动态注册广播的过程,我们需要把他优化下——不过只是提醒网络发生了变化还不够人性化,最好是能准确地告诉用户当前是有网络还是没有网络,因此我们还需要对上面的代码进行进一步的优化

技术分享

????在上述改写的过程中有一点值得特别注意,Android系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则程序将会直接崩溃,比如这里查询系统的网络状态就是需要声明权限的。

在AndroidManifest.xml文件中进行声明:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

技术分享

2.2 静态注册实现开机启动

????动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。

静态注册的方式把注册的逻辑动作放在AndroidMainfest.xml文件中。当然,因为静态注册时将注册的行为放到AndroidMainfest.xml中,所以继承BroadcastReceiver的类不能定义成内部类,需要定义为一个单独的类

S1:创建继承BroadcastReceiver的实体类并重写onReceive()方法

技术分享

S2:在AndroidMainfest.xml文件中注册,并声明权限

技术分享

<application>标签内出现了一个新的标签<receiver>,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和<activity>标签非常相似,首先通过android:name来指定具体注册哪一个广播接收器,然后在<intent-filter>标签里加入想要接收的广播就行了,由于Android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播,因此我们在这里添加了相应的action。

另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用<uses-permission>标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED权限。

3、发送自定义广播

自定义广播就是非系统发送出来的广播,说实话,前面介绍的仅仅是写一个广播接收器和它的注册。没有涉及到如何定义一个广播类已经广播内容如何发出。

当然,自定义广播也分为两种——标准广播和有序广播。

3.1 发送标准广播

S1:新建一个继承BroadcastReceiver类的类————MyBroadcastReceiver.java,并重写onReceiver()方法;

技术分享

S2:在AndroidMainfest.xml中对上述广播接收器进行注册和赋权;

技术分享

S3:在一个布局中添加一个按钮,用于触发发送广播功能.这里我们选择在activity_main.xml文件;

技术分享

S4:在Button的监听方法中实现发送广播的功能:

????????Intent intent = new Intent("com.exmple.broadcasttest.MY_BROADCAST");

????????sendBroadcast(intent);

?

3.2 发送有序广播

????有序广播和无序广播的区别:

????????就是在发送广播时这么实现就可以了:

????????????Intent intent = new Intent("com.exmple.broadcasttest.MY_BROADCAST");

????????sendBroadcast(intent,null);

技术分享

那么该如何设定广播接收器的先后顺序呢?----优先级,在AndroidMainfest.xml文件中定义

技术分享

那么,如何截断这条自定义广播呢?---在MyBroadcastReceiver的onReceiver()方法中调用abortBroadcast()方法,表示截断

技术分享

4、使用本地广播

Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自本应用程序发出的广播.

本地广播机制使得应用程序在使用广播来共享和传递信息时,只有本程序内部可见,保证其安全性.

技术分享

最后我们再来盘点一下使用本地广播的几点优势吧。

1. 可以明确地知道正在发送的广播不会离开我们的程序,因此不需要担心机密数据泄漏的问题。

2. 其他的程序无法将广播发送到我们程序的内部,因此不需要担心会有安全漏洞的隐患。

3. 发送本地广播比起发送系统全局广播将会更加高效。

?

5、广播的最佳实现——实现强制下线功能

结合前面介绍的内容实现一个APP登录后的界面有个按钮,点击后自动下线返回登录界面.这里自动跳转使用广播实现!略!

6、Git时间,初识版本控制工具

6.1 安装Git

1,Google下 Git Windows7 Download

Download:https://git-scm.com/

2,安装

3,配置

????????git config --global user.name "metitation"

????????git config --global user.email "zhongweipeng@huawei.com"

技术分享

6.2 创建代码仓库

创建代码仓库很简单,就是执行命令git init

????技术分享

这里执行完成后多个文件夹.git/,如果你想要删除本地仓库,只需要删除这个文件夹就行了.

6.3 提交本地代码

技术分享

?

技术分享

7、小结与点评

总结的话我就不抄袭书本了,这里有个扩展任务------"如何搭建一个独立博客——简明 Github Pages与 jekyll 教程"

http://cnfeat.com/blog/2014/05/10/how-to-build-a-blog/

有空尝试下

第五章 全局大喇叭,详解广播机制

标签:

原文地址:http://www.cnblogs.com/angel-of-death/p/5575689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!