黑马程序员技术交流社区

标题: 【阳哥专栏】黑马Android教程-Android基础07广播 [打印本页]

作者: 王震阳老师    时间: 2015-3-19 15:10
标题: 【阳哥专栏】黑马Android教程-Android基础07广播
本帖最后由 王震阳老师 于 2015-3-23 22:22 编辑

Android基础-07广播

黑马程序员上海校区招生火爆开启!阳哥约你在上海!







pdf附件回复可见:

1. BroadcastReceiver简介(★★★★
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。
广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast/sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
1.1 实现一个BroadcastReceiver
需求:定义一个广播接收器,用于接收SDCard移除时发送的广播。
创建一个新的Android工程《广播接收器》,包名:com.itheima.broadcastReciver。
在src目录下新建一个SDCardUnmountedReceiver类继承BroadcastReceiver类,覆写onReceive方法,代码清单如下:
注册SDCardUnmountedReceiver。
:注册一个广播接收者有两种方式。
   静态注册:在AndroidManifest.xml中注册广播
在AndroidManifest.xml文件中添加如下配置:
  动态注册:在Java代码中注册
由于Android高版本中已经不支持SDCard的卸载,因此我们使用Android 2.3版本的模拟器。在settings->Storage settings中可以找到Unmount SD Card。点击此选项可以移除SDCard。
软件运行效果截图如下:发现Toast成功打印出了“SDCard已经被移除”信息。

★ java代码注册的广播接收者优先级要比清单文件的要高, 但是当前的广播接收者的生命周期的期限和activity是相关联的,activity销毁,广播接收者也就不再起作用。
★ 通过清单文件注册的广播接收者在系统中运行一次后就会被注册到系统中,以后无需运行此广播接受者,但是也可以接收到广播。
★ 接收广播时要注意在清单文件中添加对应的权限。

2. Android中常见广播(★★★2.1 监听拨打电话广播
需求:监听用户拨打电话,在用户拨打电话号码前自动加上17951等。
拦截的广播:
需要的权限:
新创建一个Android工程《IPCaller》。
在src目录下新创建一个类IPCallerReceiver继承BroadcastReceiver,重写OnReceive方法。
在AndroidManifest.xml中注册广播接收者。
在下面的配置文件中 <intent-filter android:priority="1000">属性代表着给当前接收者设置优先级,优先级越高越优先接收到广播。
运行上面的代码,然后拨打电话5556,发现拨出去的号码已经变为179515556。
运行效果图如下:

2.2 监听系统开机的广播
需求:
拦截手机开机的广播,手机开机后,弹一个提示。
拦截的广播:
需要的权限:
虚拟机重启命令:adb shell reboot
:3.0以上版本必须加权限, 以下的版本可以不加,3.0以上的版本如果用户没有启动过程序, 接收不到开启启动完成的广播。
新创建一个Android工程《开机启动》。
在src目录下新创建一个类BootReceiver继承BroadcastReceiver,重写OnReceive方法。
在AndroidManifest.xml中注册广播接收者。
将上面的代码部署到模拟器上,然后关机重启模拟器。
运行效果图如下:

2.3 监听安装和卸载程序的广播
需求:
监听程序的安装或者卸载,并在LogCat中输出提示信息。
拦截的广播:
指定scheme: package
新创建一个Android工程《监听应用安装与卸载》
新创建InstallReceiver类继承BroadcastReceiver类,覆写onReceive方法
在AndroidManifest.xml清单中注册InstallReceiver。
将上面的工程部署在模拟器上。然后通过系统应用管理工具,卸载一个应用程序,发现成功接收到了应用被卸载的广播。运行图如下:
2.4 拦截短信
需求:
对用户接收的短信进行拦截,若是10086发来的短信,将此短信拦截。
拦截的广播:
需要的权限:
:android 4.2 后废除了此action。
新创建一个工程《短信拦截》,在src目录下新建SMSReceiver类继承BroadcastReceiver类
在AndroidManifest.xml中注册短信拦截器
在AndroidManifest.xml中添加权限
将上面的工程部署在模拟器上
打开DDMS视图,选择Emulator Control 选项卡,在Incomeing number:中填写一个号码,模拟发送消息的号码。然后选择SMS单选按钮,在右侧的输入框输入短信的内容。然后点击Send按钮,发送信息。
运行截图如下:发现成功拦截了刚才发送的短信。
3. 发送自定义广播(★★★★3.1无序广播
无序广播不可以被拦截,如果被拦截的话会报错:
所有接收无序广播的广播接收者在此广播被发送时均能接收到此广播
无序广播使用sendBroadcast方法来发送
:无序广播的实现比较简单,因此这里只给出核心代码。
3.2有序广播
有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的        
广播接收者的优先级的取值范围是: 1000(最高) ~ -1000(最低)
相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先收到广播
无序广播使用sendOrderedBroadcast方法来发送,使用abortBroadcast方法拦截
广播接收者的优先级在清单文件中声明接收者时,在<intent-filter>标签下通过设置”android:property”属性来设置
我们新创建一个项目,来演示无序广播的发送和接收过程。
新创建一个Android工程《广播发送和接收》,包名com.itheima.broadcastAndreceiver。
在默认的MainActivity的布局中添加一个按钮,绑定事件,该事件的核心功能是发送一个有序广播,MainActivity类代码清单如下:
分别编写MyReceiver和MyReceiver2类,继承BroadcastReceiver类
MyReceiver类代码清单:
MyReceiver2类代码清单:
在AndroidManifest.xml中注册MyReceiver和MyReceiver2
:在上面清单文件中我们给MyReceiver设置了最高优先级1000,给MyReceiver2设置了最低优先级-1000。
下面我们分多钟情况,分别演示有序广播的接收规律
  1、直接部署上面的工程到模拟器,点击发送广播按钮,控制台结果为:
我们发现MyReceiver先接收到了广播,然后MyReceiver2才接收到广播。
   2、修改MyReceiver类的代码:在onReceive方法中添加abortBroadcast()方法,
然重新部署该工程,运行,点击发送广播按钮。这时控制台打印信息为:
我们发现只有MyReceiver接收到了广播,而MyReceiver2没有接收到广播。原因就是我们在MyReceiver中执行了abortBroadcast()方法,终止了该广播。
  3、在第二种情况的基础上,我们修改MainActivity类中sendOrder方法,修改
sendOrderedBroadcast中第三个参数,指定一个最终接收器。
运行上面工程,然后点击发送广播按钮,发现控制台输出如下信息:
我们发现,虽然在MyReceiver中我们调用了abortBroadcast();方法,但是广播依然被MyReceiver2接收到。原因是我们在sendOrderedBroadcast方法中指定了MyReceiver2接收器为最终接收器,因此该广播被终止的时候MyReceiver2接收器依然可以接收到广播。
4、在第3种情形的基础上,我们修改MyReceiver类,我们将该类中的onReceive方法中的abortBroadcast();方法去掉。然后运行上面工程。发现控制台输入如下信息:
我们发现MyReceiver第一个接收到广播,MyReceiver2第二个接收到广播,然后MyReceiver2又接收到一次广播。对的,结果确实是这样,因为我们在sendOrderedBroadcast方法中,将MyReceiver2作为最终接收器,那么我们发出的广播会被所有符合条件的接收器接收,最后指定的最终接收器不管是否已经接收过信息依然会再次接收。

至此,本文档内容完!





作者: 班主任-杨茜老师    时间: 2015-3-19 15:57
赞一个,阳哥威武:lol
作者: 柳柳桑    时间: 2015-3-19 15:58
好赞,支持一下~:victory:
作者: 班主任-杨茜老师    时间: 2015-3-19 15:58
竟然是沙发
作者: 王震阳老师    时间: 2015-3-19 15:59
柳柳桑 发表于 2015-3-19 15:58
好赞,支持一下~

这种技术贴,回复的一般不多呀,不如技术分活动多。我准备发下一期技术分活动贴。
作者: 艺多不压身丶    时间: 2015-3-19 15:59
{:3_68:}赞一个,表示看不懂
作者: 柳柳桑    时间: 2015-3-19 16:00
王震阳老师 发表于 2015-3-19 15:59
这种技术贴,回复的一般不多呀,不如技术分活动多。我准备发下一期技术分活动贴。 ...

恩恩,大家即想答题,又想挣技术分~
作者: 王震阳老师    时间: 2015-3-19 16:00
艺多不压身丶 发表于 2015-3-19 15:59
赞一个,表示看不懂

真看不懂吗?
作者: 王震阳老师    时间: 2015-3-19 16:01
柳柳桑 发表于 2015-3-19 16:00
恩恩,大家即想答题,又想挣技术分~

今天晚上有时间的话,也该发新一期的技术分活动了。
作者: 艺多不压身丶    时间: 2015-3-19 16:02
王震阳老师 发表于 2015-3-19 16:00
真看不懂吗?

代码看不懂,都没学过{:3_47:}
作者: 企业部-娜美    时间: 2015-3-19 16:02
嘟嘟嘟~~阳哥好牛,必须赞!:lol
作者: jokerzzz    时间: 2015-3-19 16:02
赞一个,学习学习
作者: 柳柳桑    时间: 2015-3-19 16:03
王震阳老师 发表于 2015-3-19 16:01
今天晚上有时间的话,也该发新一期的技术分活动了。

欢迎欢迎,马友们很喜欢技术分活动{:2_31:}
作者: 艺多不压身丶    时间: 2015-3-19 16:04
柳柳桑 发表于 2015-3-19 16:03
欢迎欢迎,马友们很喜欢技术分活动

这倒是真的{:3_64:}
作者: 王震阳老师    时间: 2015-3-19 16:05
艺多不压身丶 发表于 2015-3-19 16:04
这倒是真的

我也说了,今天晚上有时间就发布最新技术分活动。
作者: 艺多不压身丶    时间: 2015-3-19 16:06
王震阳老师 发表于 2015-3-19 16:05
我也说了,今天晚上有时间就发布最新技术分活动。

嗯呢,看见啦。辛苦啦欧巴{:3_67:}
作者: Ansel    时间: 2015-3-19 16:07
看不懂,只能混个脸熟!
作者: 柳柳桑    时间: 2015-3-19 16:08
王震阳老师 发表于 2015-3-19 16:05
我也说了,今天晚上有时间就发布最新技术分活动。

阳哥受累了~敬礼!~
作者: 王震阳老师    时间: 2015-3-19 16:09
Ansel 发表于 2015-3-19 16:07
看不懂,只能混个脸熟!

javase学好的,要学Android的可以预习。
作者: 冬天下雪    时间: 2015-3-19 16:15
赞一个                                
作者: gaopeng868988    时间: 2015-3-19 16:33
赞一个   
作者: yh903450130    时间: 2015-3-19 16:54
javase学好的,要学Android的可以预习。
作者: 火七君    时间: 2015-3-19 17:11
先收了慢慢看
作者: みぎ    时间: 2015-3-19 17:12
{:3_46:}赞一个,虽然还
作者: qsmaxmin    时间: 2015-3-19 17:20
不错,受教了。。
作者: jackwang    时间: 2015-3-19 17:20
赞!收藏了!学习的时候用的到!
作者: 班主任-唐诗老师    时间: 2015-3-19 17:21
我是来顶贴的
作者: 张耀东    时间: 2015-3-19 17:24
还在看基础,支持!!
作者: okandy520    时间: 2015-3-19 17:51
我是来顶贴的
作者: java梦想    时间: 2015-3-19 17:55
看不懂,但是还是要赞一个。
作者: wwwlcy    时间: 2015-3-19 18:31
GOOD,顶个!!
作者: 958316737    时间: 2015-3-19 18:55
好赞。。好有技术的。。。
作者: 梅西    时间: 2015-3-19 19:29
哇噢噢噢噢哦哦哦,好棒
作者: lin123    时间: 2015-3-19 19:42
赞一个
作者: 有丶时候    时间: 2015-3-19 20:08
赞一个!
作者: 千殇一梦    时间: 2015-3-19 20:35
先来看看。
作者: 路文龙    时间: 2015-3-19 20:41
赞一个。
作者: Grady    时间: 2015-3-19 21:12
看不懂,但是赞一个
作者: shamoman    时间: 2015-3-19 21:20
来看看了,可是怎么看全文?
作者: zailushang326    时间: 2015-3-19 21:20
上海黑马
作者: 夜班心桥    时间: 2015-3-19 21:27
好强的技术,需要更加努力了,争取赶上阳哥!
作者: 邓士林    时间: 2015-3-19 21:35
好久没来了,错过了阳哥的技术分活动哈。最近在学习Android基础,有个问题想请教下:关于Context的生命周期问题,
作者: 熊曼    时间: 2015-3-19 21:43
哈哈,看看
作者: jc_cui2005    时间: 2015-3-19 22:08
阳哥,路过,咩~
作者: 王震阳老师    时间: 2015-3-19 22:10
夜班心桥 发表于 2015-3-19 21:27
好强的技术,需要更加努力了,争取赶上阳哥!

加油。
作者: 王震阳老师    时间: 2015-3-19 22:17
jc_cui2005 发表于 2015-3-19 22:08
阳哥,路过,咩~

好吧,卖萌都行
作者: 黄韦周    时间: 2015-3-19 22:28
目标深圳62期安卓班
作者: Eternal007    时间: 2015-3-19 22:33
好详细。。。。
作者: 王震阳老师    时间: 2015-3-19 22:37
shamoman 发表于 2015-3-19 21:20
来看看了,可是怎么看全文?

应该可以看到全文呀?你说的全文指啥呀?
作者: 有艺术的刺客    时间: 2015-3-19 22:41
厉害,果断点赞。:D
作者: 王震阳老师    时间: 2015-3-19 22:41
邓士林 发表于 2015-3-19 21:35
好久没来了,错过了阳哥的技术分活动哈。最近在学习Android基础,有个问题想请教下:关于Context的生命周期 ...

Context代表了整个应用程序的设备上下文,其生命周期跟我们的整个应用是一起的,应用启动的时候创建,应用退出时销毁。
作者: a1301155262    时间: 2015-3-19 23:00
果断点赞
作者: 栗子木头    时间: 2015-3-19 23:06
66666,,必须赞
作者: 滕玉坤    时间: 2015-3-19 23:48
广播机制,赞一个!
作者: tubao1991    时间: 2015-3-20 07:39
不是很懂!顶一个!
作者: 白春秋    时间: 2015-3-20 07:51
路过 赞一个
作者: gaopeng868988    时间: 2015-3-20 09:34
赞一个     
作者: 唐泉银    时间: 2015-3-20 09:49
完全不懂
作者: itheima_llt    时间: 2015-3-20 09:50
什么东西啊 ????
作者: itheima_llt    时间: 2015-3-20 09:51
BroadcastReceiver不了解啊
作者: itheima_llt    时间: 2015-3-20 09:52
原来是安卓里面的,还没学习呢!
作者: 为梦想而生    时间: 2015-3-20 12:54
赞一个,代码只懂部分,思路也没达到。。。。。。
作者: ITheima-Ssmnr    时间: 2015-3-20 13:12
赞一个 不错不错
作者: q25225    时间: 2015-3-20 14:29
要好好预习Android,不然到时候赶不上了
作者: 星河    时间: 2015-3-20 18:13
赞一个,表示看不懂
作者: 青岛_黑马    时间: 2015-3-20 19:19
代码看不懂
作者: a4230517    时间: 2015-3-20 19:19
学习一下!
作者: tubao1991    时间: 2015-3-20 19:45
赞一个,顶!
作者: 虚谷    时间: 2015-3-20 22:20
学习了,非常感谢老师
作者: a1301155262    时间: 2015-3-20 22:30
写的好,赞一个
作者: 王震阳老师    时间: 2015-3-20 23:00
虚谷 发表于 2015-3-20 22:20
学习了,非常感谢老师

哈哈,非常感谢。
作者: 王震阳老师    时间: 2015-3-20 23:00
q25225 发表于 2015-3-20 14:29
要好好预习Android,不然到时候赶不上了

被录取了吗?
作者: daveyang    时间: 2015-3-20 23:27
好实用的帖子,可惜现在还看不了
作者: 王震阳老师    时间: 2015-3-20 23:29
daveyang 发表于 2015-3-20 23:27
好实用的帖子,可惜现在还看不了

没事儿,加油。
作者: Dawn3    时间: 2015-3-20 23:58
赞啊,赞一个
作者: q25225    时间: 2015-3-21 00:01
王震阳老师 发表于 2015-3-20 23:00
被录取了吗?

老师呀 ,我技术分还不够呀,一整天都在刷你的题目呢。麻烦您看到帮我加一下分呀。谢谢您
作者: 柯泉    时间: 2015-3-21 00:28
杨哥是谁啊  很牛逼啊?
作者: 柯泉    时间: 2015-3-21 00:30
杨哥是谁啊  很牛逼啊?
作者: 王震阳老师    时间: 2015-3-21 09:24
q25225 发表于 2015-3-21 00:01
老师呀 ,我技术分还不够呀,一整天都在刷你的题目呢。麻烦您看到帮我加一下分呀。谢谢您 ...

提交答案就会有的。
作者: schwiftX    时间: 2015-3-21 10:07
试图看了下没有看懂,还是得把基础打牢。。。
作者: 王震阳老师    时间: 2015-3-21 10:09
schwiftX 发表于 2015-3-21 10:07
试图看了下没有看懂,还是得把基础打牢。。。

恩,基础是最重要的。
作者: q25225    时间: 2015-3-21 11:01
王震阳老师 发表于 2015-3-21 09:24
提交答案就会有的。

谢谢阳哥的分数,刷题,刷题 ,,
作者: liyuehua    时间: 2015-3-21 21:56
还看不懂,收藏了慢慢研究。
作者: 落后就要挨打    时间: 2015-3-21 23:33
阳哥贴的东西都是干货啊!
作者: 小亮smile    时间: 2015-3-21 23:38
非常赞,顶顶顶顶顶!
作者: 随心i    时间: 2015-3-22 13:41
之前学过一段时间的Android,但是看到你写的代码,瞬间感觉自己弱爆了,自己的基础有待加深呀
作者: bianzhiguo6    时间: 2015-3-23 10:30
赞一个。。。
作者: yh903450130    时间: 2015-3-23 11:05
能把pdf文件集中发下嘛 跪求
作者: godot    时间: 2015-3-23 11:27
谢谢谢谢!
作者: ordinary    时间: 2015-3-23 20:07
好厉害,虽然现在不懂,但是以你做个榜样,我也一定会的
作者: ordinary    时间: 2015-3-23 20:09
虽然现在还看不大懂,我会以你这种水准做个榜样,好好加油,干吧得
作者: 王震阳老师    时间: 2015-3-23 21:31
ordinary 发表于 2015-3-23 20:09
虽然现在还看不大懂,我会以你这种水准做个榜样,好好加油,干吧得

加油!
作者: schwiftX    时间: 2015-3-23 21:55
想知道每期的答案都发在哪啊
作者: 王震阳老师    时间: 2015-3-23 21:59
schwiftX 发表于 2015-3-23 21:55
想知道每期的答案都发在哪啊

我一般会把过期提交的正确答案以回复的形式贴出来。
作者: schwiftX    时间: 2015-3-23 22:06
王震阳老师 发表于 2015-3-23 21:59
我一般会把过期提交的正确答案以回复的形式贴出来。

哦 好的 谢谢!
作者: SunshineCui    时间: 2015-3-23 22:14
赞一个,看不懂。。。

作者: macover    时间: 2015-3-23 22:52
收藏先,非常感谢
作者: 萍水相逢    时间: 2015-3-24 09:14
谢谢阳哥的笔记
作者: mayor125    时间: 2015-3-24 10:15
好好学习~~顶一顶
作者: 王震阳老师    时间: 2015-3-24 23:41
萍水相逢 发表于 2015-3-24 09:14
谢谢阳哥的笔记

感谢支持。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2