Android中的intent
在你开始与拨号盘交互之前,你需要你理解你要使用的代码类型。Andriod使用Intent在应用程序中定义工作。一旦你掌握了Intents的使用,一个全新的应用程序开发世界将会想你敞开。本节定义了Intent是什么和如何使用它。
一个Intent是Android从一个Activity(活动)传递信息到另外一个活动的方法。你可以认为一个Intent是一个活动间交换的信息。例如,假定你有一个活动需要来打开一个网页浏览器并且在Android设备上显示一个页面。你的活动应当发送一个“在网页浏览器中打开某页的Intent(意图)”,就像一个WEB_SEARCH_ACTION的Intent,一个Android Intent解答器。Intent解答器从语法上分析一个活动的列表并且选择最匹配你的Intent的一个。那就是,网页浏览器的活动。Intent解答器然后传递你的网页到浏览器中并且启动网页浏览器活动。
Intents被分成两个主要目录
●Activity Action Intents(活动动作意图)Intents用来呼叫应用程序以外的活动。只有一个活动可以处理Intent。例如,对于网页浏览器,你需要打开网页浏览器活动来显示一个页面。
●Broadcast Intents(广播意图)Intents被送出到多个活动来处理。一个被Android发出的广播意图的例子就是,当前电池的电量。任何活动处理这个意图并适时的反应。——例如,如果电池电量低到一定程度,取消一个活动。
表格7-1列出并且描述了通用的,可以使用活动动作意图。正如你注意到的一样,大多数情况下,从Intent名字可以看出这个Intent是做什么的。
Activity Action Intent Message
ADD_SHORTCUT_ACTION增加一个功能快捷菜单到Android的主屏
ALL_APPS_ACTION列出设备上可用的所有应用程序
ANSWER_ACTION接电话
BUG_REPORT_ACTION打开调试报告活动
CALL_ACTION呼叫一个提供的位置
DELETE_ACTION删除定义的数据
DIAL_ACTION打开拨号活动并且拨打一个定义好的号码
EDIT_ACTION对有权使用的数据提供编辑
拨打一个紧急号码
EMERGENCY_DIAL_ACTIO
N
FACTORY_TEST_ACTION回复工厂测试设定
GET_CONTENT_ACTION选择并返回定义的数据
INSERT_ACTION插入一个空的条目
MAIN_ACTION建立一个活动开始点
PICK_ACTION挑选一个条目并且返回一个选择
PICK_ACTIVITY_ACTION挑选一个特定的活动(返回一个类)
RUN_ACTION执行特定的数据
SEARCH_ACTION在系统上启动搜索
SEND_ACTION发送数据给没有定义的接收者
SENDTO_ACTION发送数据到指定的接收者
SETTINGS_ACTION启动系统设定
SYNC_ACTION和外部的源同步手机
VIEW_ACTION
(DEFAULT_ACTION)
打开一个视图
WALLPAPER_SETTINGS_AC
TION
显示修改Android墙纸的设定
WEB_SEARCH_ACTION打开谷歌搜索,或者其它定义过的网页
注意
本章中的应用程序会用到列在表7-1中的Intents:
CALL_ACTION和DIAL_ACTION。这些Intents使你有进入手机拨号和呼叫的能力。
表格7-2列出并描述了通用的广播意图。当你需要为一个定义的Intent建立一个接受器时,请参考这个表。
Broadcast Intent信息
CALL_FORWARDING_STATE_CHANGED_ACTI ON 电话呼叫转接状态已经改变
CAMERA_BUTTON_ACTION照相机的按钮被按下CONFIGURATION_CHANGED_ACTION设备配置发生改变DATA_ACTIVITY_STATE_CHANGED_ACTION设备的数据活动状态
改变
DATA_CONNECTION_STATE_CHANGED_ACTIO
N
数据连接状态改变
DATE_CHANGED_ACTION手机系统数据改变FOTA_CANCEL_ACTION取消未决的系统更新
下载
FOTA_INSTALL_ACTION升级已经下载必须立
即安装(由系统发送)FOTA_READY_ACTION升级已经下载可以延
迟安装(由系统发送)FOTA_RESTART_ACTION重启一个系统升级下
FOTA_UPDATE_ACTION开始系统升级下载GTALK_SERVICES_CONNECTED_ACTION发送当GTALK已经成
功建立
GTALK_SERVICES_DISCONNECTED_ACTION发送当GTALK已经断
MEDIA_BAD_REMOVAL_ACTION发送当一个SD储存卡
移开但是从系统中未
成功移除
MEDIA_BUTTON_ACTION发送当媒体按钮按下
MEDIA_EJECT_ACTION发送当弹出动作为一
个SD储存卡被初始化
MEDIA_MOUNTED_ACTION发送当一个SD储存卡
在系统中成功安装
MEDIA_REMOVED_ACTION发送当检测到储存卡
移出
MEDIA_SCANNER_FINISHED_ACTION发送当扫描器完成
MEDIA_SHARED_STARTED_ACTION发送当扫描器开始
MEDIA_UNMOUNTED_ACTION发送当SD卡被检测到
但是没有被安装
MESSAGE_WAITING_STATE_CHANGED手机“信息等待”状态发
生变化
NETWORK_TICKLE_RECEIVED_ACTION一个新网络设备通知
被接受
PACKAGE_ADDED_ACTION当一个新的包装被安
装在设备上发送
PACKAGE_CHANGE_ACTION发送当现存的包装发
生改变
PACKAGE_INSTALL_ACTION一个包装可以被下载
和安装
PACKAGE_REMOVED_ACTION一个包装已经被移除
PHONE_INTERFACE_ADDED_ACTION设备的手机界面已经
被建立
PHONE_STATE_CHANGED_ACTION设备的手机状态已经
改变
PROVIDER_CHANGED_ACTION设备从一个接收者处
接收到通知
PROVISIONING_CHECK_ACTION从供给服务中检测最
新的设定
SCREEN_OFF_ACTION屏幕被关闭(设备发
送)
SCREEN_ON_ACTION屏幕被打开(设备发
送)
SERVICE_STATE_CHANGED_ACTION服务状态被改变
SIGNAL_STRENGTH_CHANGED_ACTION信号强度改变
注意
一些广播意图经常被发送,如TIME_TICK_ACTION
和SIGNAL_STRENGTH_CHANGED_ACTION。使用时请谨慎处理。你不应当试着去同时接受这样的
广播。Intent只是大约三分之一。其实Intent只是做了某些事情,而且它不能自己来做任何事。你需要Intent过滤器和Intent接受其来听,翻译Intents.一个Intent接收器就像一个Activity的邮箱。Intent接收器被用来允许一个活动来接受定义的Intent。使用前一个
网页浏览器的例子,网页浏览器活动被设定来接受网页浏览器Intent。一个像这样的系统允许不相关的活动来忽略不能处理的Intent。它同时允许需要其它活动辅助的活动利用这个活动,而不需要知道如何呼叫它。
有了Intents和Intents接收器,一个活动可以发送一个Intent并且另外一个可以接受。不过,需要一些东西来管理两个活动之间的信息类型。这就是为什么要用Intent过滤器了。
Intent过滤器被活动用来描述要接受的Intent类型。更重要的是,它们在Intent的内部概括了传递的数据类型。因此,在我们例子的方案中,我们要网页浏览器来打开网页。Intent 过滤器将会陈述数据使用WEB_SEARCH_ACTION Intent应当是URL格式的。
在下一节中,你将开始使用Intent来打开和利用电话的拨号盘。
在你知道Intent是什么了,是时候来看它如何运转的了。本节想你展示如何使用DIAL_ACTION这个Intent来打开电话的拨号盘。你将用你的Intent来传递一个电话号码。如果应用程序工作正常,你将会看到由Intent传递,而显示在拨号盘内的号码。
第一步是为这个活动创建一个项目(具体操作见第五章:Android程序员向导目录)。把项目命名为AndroidPhoneDialer。下面的插图就是这个项目的新Android项目向导(略)。
在Eclipse内打开的新的应用程序,第一个要做的就是从l中移除包含Hello World声明的TextView。在删除了TextView后,l文件应当看起来如下:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android=schemas.android/apk/res/android
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
</LinearLayout>
你需要增加两个新的包装到你的项目中来使用DIAL_ACTION Intent,如下,第一个包装允许你设置Intents并且第二个允许你来分析URIs。
t.Intent;
import android.Uri;
注意
对于DIAL_ACTION这个Intent有一些不同的Intent过滤器可以使用。你正在使用的是允许你把号码作为了一个URI来传递的过滤器。
下一步就是来创建你的Intent。创建一个Intent的语法如下:
Intent<intent_name>=new Intent(<Android_Intent>,<data>)
对于你的应用程序,把第一个参数<intent_name>用DialIntent替换掉。要获得第二个参数的数值,请参考Activity Action中的列表。(列表在文章中:什么是Intent)。要呼叫拨号盘,
你需要使用DIAL_ACTION Intent。要正确的呼叫Intent,使用Intent.DIAL_ACTION这个格式。最后的
参数<data>,就是电话号码。DIAL_ACTION intent把号码作为一个URI。因此,你需要使用Uri.parse来分析出电话号码。使用Uri.parse将确保DIAL_ACTION intent能够理解你试图拨打的号码。你传递了一个Uri.parse的字符串来展示你要拨打的号码,在本例中是"tel:5551212"。
为你项目创建的最后一个呼叫应该像这样:
Intent DialIntent=new
Intent(Intent.DIAL_ACTION,Uri.parse("tel:5551212"));
提示
你使用记号tel:<phone_number>来呼叫一个指定的电话号码。你还可以使用voicemail来替代tel:呼出一个电话voicemail的快捷方式。
Intent创建后,你现在必须告诉Android你想要拨号盘在新的活动中被启动。要这样做,你使用setLaunchFlags()的Intent方法。你必须为启动来传递setLaunchFlags()合适的参数。下面是可以设置接受启动旗帜的一组列表:
注意
在其它情况下,可能会有超过一个的旗帜被设置来完成希望的结果。
●NO_HISTORY_LAUNCH启动活动,不记录在系统启动历史中
●SINGLE_TOP_LAUNCH告诉系统不要启动活动,如果该活动已经在运行
●NEW_TASK_LAUNCH启动活动
●MULTIPLE_TASK_LAUNCH启动活动,即使它已经在运行了
●FORWARD_RESULT_LAUNCH允许新的活动来接受结果,这个结果通常被转递给现存的活动。本例中,你要使用intent.NEW_TASK_LAUNCH,这样可以简单的让你打开一个新的拨号盘活动示例:
DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH);
创建拨号盘的最后一步是启动活动。(更精确的说,你告诉Android你有一个作为新任务来启动的拨号盘。最终由Android来启动拨号盘活动)。要告诉Android你要启动拨号盘,你需要使用startActivity():
startActivity(DialIntent);
web浏览器在哪里打开
请注意到你把intent传递到startActivity()。这个Intent然后传递到Andriod,然后活动被执行。完整的An
droidPhoneDialer.java文件代码应当如下:
package android_programmers_guide.AndroidPhoneDialer;
import android.app.Activity;
t.Intent;
import android.os.Bundle;
import android.Uri;
public class AndroidPhoneDialer extends Activity{
/**Called when the Activity is first created.*/
@Override
public void onCreate(Bundle icicle){
setContentView(R.layout.main);
/**Create our Intent to call the Dialer*/
/**Pass the Dialer the number5551212*/
Intent DialIntent=new
Intent(Intent.DIAL_ACTION,Uri.parse("tel:5551212"));
/**Use NEW_TASK_LAUNCH to launch the Dialer Activity*/
DialIntent.setLaunchFlags(Intent.NEW_TASK_LAUNCH);
/**Finally start the Activity*/
startActivity(DialIntent);
}
}
你现在应当来编译AndroidPhoneDialer并且在模拟器中运行它。处理编译和运行应用程序的过程在前面的章节中描述过了。你应当已经熟悉这些过程了。一旦你运行应用程序,模拟器启动。在漫长的启动过程后,你的活动被启动。
提示
保持模拟器运行是一个好主意,即使你完成了你的活动并且以及返回到代码窗口。大多数人的本能习惯是在他们完成了测试活动后关闭模拟器。但是,我发现使模拟器一直开启会帮助两个主要的问题。第一个就是启动模拟器要花费大量的时间。保持模拟器开启会避开漫长的开启时间。第二,我已经注意到有好几次当我做一些小的修改到一个活动,而且它们没有被复制到模拟器。保持模拟器开启似乎可以缓解这个问题。如果你在模拟器中有问题,在你的电脑中移除userdata-qemu.img文件。这个会让模拟器从一个干净的镜像启动。
如果你正确的跟从本例中的代码,你应当能看到下面的结果(略):
如你所见,你已经打开了电话的拨号盘。这个拨号盘显示了你传递的号码,5551212。使用模拟器,点击呼叫按钮。现在电话应当虚拟的呼叫555-1212。显示拨号盘是有用的,加入你创建了一个应用程序运行用户来在呼叫前可以编辑号码,或者确认他们真的想要呼叫这个号码。那么你应当怎么做来让应用程序为你打电话呢?答案就在下一节中。
在本节中你将会学到呼叫拨号盘时增加什么样的Intent。你还会学到在活动代码中的哪一个地方增加选择的Intent。另外,你将学习如何分析一个作为URI的电话号码。从拨号盘活动代码变成呼叫活动你需要更改一些代码。在本节中,你回去编辑AndroidPhoneDialer活动,在打开拨号盘后,来打一个电话。
在活动中增加一个Intent,你还是需要Intent和Uri包装,所以,在AndroidPhoneDialer.java 的文件头部保留这一部分。
t.Intent;
import android.Uri;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。