黑马程序员安卓教程:广播接收者案例之ip拨号器二

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

广播接收者案例之ip拨号器二

当拨打电话时,系统会广播该拨打电话事件。因此,我们需要做的是:编写一个BroadcastReceiver,通过该广播接收者来获取系统的电话拨打事件,然后再做一系列的业务逻辑处理。具体操作可以分为以下三步:

1.编写广播接收者

在“01_ip拨号器”工程中编写一个广播接收者,命名为“OutCallReceiver”。此时工程结构如图1-1所示:

图1-1所示

在OutCallReceiver类中,使OutCallReceiver继承BroadcastReceiver并重写onReceive方法。代码如例1-1:

例1-1

对于onReceive方法,参考如下图1-2所示:

图1-2所示

从图1-2可知:当广播接收者收到一个Intent广播时,该方法就会被调用。此时我们便可以来查看或修改该广播接收者的结果值。该方法有两个参数,分别是Context和Intent,前者表示这个广播接收者运行的上下文,后者表示这个广播接收者所接收到的Intent意图。

2.声明该广播接收者

在第一步中,我们已经编写一个广播接收者啦,即相当于有了一个收音机。有了收音机就可以接收到广播了吗?答案是否定的,此时我们还需要给该收音机上电池,还需调频。同理,有了广播接收者并不能接收到系统的广播,我们需要在清单文件中声明该广播接收者,代码如例1-2所示:

例1-2在“01_ip拨号器”的清单文件中注册了一个接收器。在声明该内容接收者时,我们使用了< receiver >标签。该标签的name属性赋值为:内容接收者的包名和类名。标签的功能参考如图1-3所示:

图1-3所示

从图1-3可知:标签声明了一个对于本应用可用的组件即BroadcastReceiver类,从而使本应用可以接收其他应用广播的动作和数据,即使这个应用本身并没有在运行。

3.指定接收的意图

在“01_ip拨号器”中,我们只接收系统拨打电话的广播意图,对于其他的广播意图我们并不关心。如何做才能只接收拨打电话的意图?此时,我们可以用意图过滤器来过滤出我们关心的广播意图。代码如例1-3所示:

例1-3

在意图过滤器中配置action的值来代表我们所关心的广播事件,拨打电话的动作就是android.intent.action.NEW_OUTGOING_CALL。Android系统已经帮我们定义好了许多常用的action值,项目中我们可以根据需要查找自己所需要的action,图1-4是几种常见的action。

图1-4所示

运行程序,然后进入系统的电话拨打应用拨打电话,此时OutCallReceiver就会接收到系统的广播,一旦OutCallReceiver接收到自己所关心的广播,方法onReceive就会执行。此时,logcat打印信息如图1-5所示:

图1-5所示

图1-5可知:当在拨打电话时,OutCallReceiver中的onReceive方法得到响应啦!下面我们需要做的就是得到拨打电话的号码,然后判断该号码是不是外地号码,如果是则在拨打之前在该号码前添加IP号;反之,直接拨打。调整例1-1代码如例1-4所示:

例1-4

例1-4可知:在onReceive方法中调用BrocadcastReceiver的getResultData() 和setResultData() 方法获取和设置电话号码。若拨打的电话号码以”0”开头,则在该电话号码前添加一个IP前缀,然后在拨打电话。假设我们拨打电话“010123456“,此时拨打电话时,效果如图1-6所示:

图1-6所示

从图1-6可知:在拨打电话时在该电话号码的前面添加了一个IP号,即17951。

注意:拨打电话,需要在清单文件中添加相应的用户权限,即:

相关文档
最新文档