6 与其它应用程序交互
一个Android应用程序通常有多个活动。每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片)。为了把用户从一个活动带到另一个,你的应用必须使用Intent定义您的应用程序做某些事情的“意图”。当你用某个方法,如 startActivity(),给系统传递一个 意图,系统就使用意图来识别并启动相应的应用程序组件。使用意图,甚至可以让你的应用程序启动在另一个的应用程序中包含的活动。
一个意图可以是显式的,用以启动一个特定的组件(一个特定的活动实例),或者是隐式的,用以启动可以处理预期动作的任何组件(如“拍摄照片”)。
这节课,告诉你如何使用意向与其他的应用程序执行一些基本的交互,如启动另一个应用程序,从该应用程序接收结果,以及使您的应用程序能够响应来自其他应用程序的意图。
课程
展示如何创建隐式的意图,启动其他应用程序,来执行一个动作。
展示如何启动另一个活动,并从活动中接收结果。
展示了如何通过定义意图过滤器声明您的应用程序接受的隐式意图,使你的应用程序中的活动对其他应用程序开放使用。
6.1把用户带到另一个应用程序
Android的最重要的特点之一是应用程序把用户带到另一个应用程序的能力,这种能力基于它想执行的“操作”。例如,如果您的应用程序有一个企业的地址,而你想在地图上显示该地址,你不必在您的应用程序中建立一个活动来显示地图。相反,你可以使用意图创建一个请求来查看该地址。Android系统接着就会启动一个能够在地图上显示地址的应用程序。
正如在第一节课“建立你的第一个应用程序”中所说的,你必须使用意图,在自己的应用程序的活动之间进行导航。你通常是使用一个显式意图,它定义了你想要启动的组件的确切的类名。然而,当你想有一个单独的应用程序执行一个操作,如“查看地图”,你必须使用一个隐式意图。
这节课告诉你如何为一个特定的操作创建一个隐式意图,以及如何用它来启动另一个应用程序中的一个活动来执行该操作。
建立一个隐式意图
隐式意图不声明要启动组件的类名,而是声明要执行的操作。该操动指定你想做的事情,如查看, 编辑,发送,或获取某些东西。意图往往还包括与操作相关的数据,如你要查看的地址,或您要发送的邮件信息。根据您要创建的意图,数据可能是一个Uri,其他几种数据类型之一,或意图可能并不需要任何的数据。
如果您的数据是一个Uri,有一个简单的Intent()构造函数,你可以用它来定义操作和数据。
例如,下面是如何创建一个意图使用Uri数据指定电话号码来发起电话呼叫的方法:
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
当您的应用程序通过调用startActivity()唤起这个意图,电话应用程序用给定的电话号码发起呼叫。
这里有一对另外的意图,以及它们的行动和Uri数据对:
· 查看地图:
· // Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based onlatitude/longitude
// Uri location =Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
· 查看一个网页:
· Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
其它类型的隐式意图需要“额外的(extra)”数据,这些数据提供了不同的数据类型,如字符串。您可以使用各种putExtra()方法添加一个或多个extra数据。
默认情况下,系统将根据包含的Uri数据决定意图所需要的合适的MIME类型 。如果你的意图不包含Uri,你通常应该使用setType()指定意图的相关数据的类型。设置MIME类型,还能指定哪些类型的活动会收到该意图。
下面是一些更多的添加extra数据来指定所要求的操作的意图,:
· 发送带附件的电子邮件:
- Intent emailIntent =newIntent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
emailIntent.putExtra(Intent.EXTRA_EMAIL,newString[]{"jon@example.com"});// recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT,"Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris
· 创建一个日历事件:
);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
和更高版本中支持。
注:你尽可能具体地定义你的意图是很重要的。例如,如果你想使用ACTION_VIEW意图显示图像,你应该指定MIME类型为 image/*
。这可以防止那些能“查看”其他类型的数据的应用程序(例如地图应用程序),被意图触发。
验证有一个应用程序能接收意图
尽管Android平台保证某些意图将由某个内置的应用程序解决(如电话、电子邮件或日历应用程序),你应该总是在调用意图之前包括验证的步骤。
注意:如果你调用一个意图,而设备上没有任何的应用程序可以处理这个意图,你的应用程序将会崩溃。
要想验证是否有一个有效的活动可以响应的意图,可调用queryIntentActivities()得到一个能够处理你的意图的活动列表。如果返回的列表不为空,你可以放心地使用的意图。例如:
;
如果isIntentSafe
为真
,那么至少有一个应用程序将响应该意图。如果它为假
,那么就不会有任何的应用程序来处理这个意图。
注:您的活动第一次启动时你应该执行此检查,以防你需要在用户尝试使用它之前禁用该意图的功能。如果你知道一个特定的应用程序可以处理这个意图,你也可以提供一个链接供用户下载此应用程序(请参阅如何链接您的产品到Google Play)。
用意图启动一个活动
。一个以上的应用程序可以处理意图时出现选择对话框时的示例。
所示。如果只有一个活动能处理意图时,系统立即启动它。
startActivity(intent);
下面是一个完整的例子,显示了如何创建一个意图来查看地图,确认存在一个应用程序来处理这个意图,然后启动它:
;
// Start an activity if it's safe
if (isIntentSafe) {
startActivity(mapIntent);
}
显示一个应用程序选择器
当你使用createChooser()来确保总是向用户显示回应你的意图的应用程序列表时,出现选择对话框的示例。
)。当用户通常希望每次使用相同的应用程序来执行操作时,如打开一个网页时(用户可能只使用一个Web浏览器),或拍摄照片(用户可能更喜欢一个照相机),这是一种不错的做法。然而,如果要执行的动作可以被多个应用程序处理,而用户可能更喜欢每一次用不同的应用程序,如“共享”操作,用户可能有几个应用程序能够共享项目,你应该明确地显示一个选择对话框,强制用户每次选择使用哪款应用执行这个操作(用户不能为操作选择一个默认的应用程序)。
要显示选择器,使用createChooser()创建一个意图,并把它传递给startActivity()。例如:
Intent intent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources forUI text. This says something like "Share this photo with"
String title = getResources().getText(R.string.chooser_title);
// Create and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);
这将显示一个对话框,包含响应传递给的createChooser()方法的意图的应用程序列表,并使用提供的文本作为对话框的标题。
跟Google学习Android开发-起始篇-与其它应用程序交互(1)的更多相关文章
-
跟Google学习Android开发-起始篇-与其它应用程序交互(2)
6.2从活动获取结果 启动另一个活动不必是单向的.您也可以启动另一个活动,并接收一个结果回来.为了接收一个结果,调用startActivityForResult()(而不是startActivity( ...
-
跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)
说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...
-
跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)
4.3 构建一个灵活的用户界面 当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验. 例如,在手持设备上,它可能是适应来在一个单窗格用户界面 ...
-
想学习Android开发
最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...
-
android初级应用到高端架构教程------ 完整体系化学习android开发
系统的学习android开发技术,从应用到底层,再到架构,告别乱糟糟的学习方式,不再是抓不住重点.从上到下贯通,全面学习android开发.让你拥有清晰的思路,一步步学习android开发! 一般而言 ...
-
Xamarin Android 之起始篇
序言: 在博客园注册了已经有2年多了,*年了.从开始学习这一行开始就在博客园注册了这个账号.至今也还没有写过一篇随笔,大多时候都是在园子里头潜水,看大牛写的文章,学习. 写博客不为啥,就是自己对自己 ...
-
站在巨人的肩膀上学习Android开发
我们知道,一開始最好的学习方法是模仿,尤其是模仿巨人. 那说到Android开发的模仿自然就是分析并研究主流程序的布局.实现方法.进而提升自己的技术. 第一招----逆向project 要分析&quo ...
-
新人学习Android开发遇到的小问题总结
1. IDE搭建: 搭建android的IDE时,先注意是什么版本的系统,64/32位系统. 通常使用的是Eclipse for android,Android Studio由于还需要FQ,网速慢,所 ...
-
10个学习Android开发的网站推荐
1. Android Developers 作为一个Android开发者,官网的资料当然不可错过,从设计,培训,指南,文档,都不应该错过,在以后的学习过程中慢慢理解体会. 2. Android Gui ...
随机推荐
-
php static延迟静态绑定
如果你是一个懒惰的程序员,你看到以下代码可能会恼火 abstract class U{ } class u1 extends U{ public static function create(){ r ...
-
[转帖]Asp.NET 弹出页面
原文链接:http://www.cnblogs.com/adi-liu/archive/2008/07/18/1246091.html ASP.NET 弹出对话框和页面之间传递值的经验总结 今天碰到一 ...
-
模拟学信网登录,Cookie 序列化,在反序列化之后不能用的问题
昨天和今天在模拟学信网登录,然后抓取用户的信息数据的时候发现一直登录不成功, 登录页面,https://account.chsi.com.cn/passport/login?service=http% ...
-
Android Studio 1.0 苹果电脑安装配置
前言 近日Google终于不负众望,发布了期待已久的Android Studio 1.0正式版.小编自己是Android开发者,之前使用过Eclipse,也试用过Android Studio 0. ...
-
【转】关于python中re模块split方法的使用
注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...
-
response重定向的网址中有中文乱码的解决办法
在servlet都是使用response对象来重定向到另一个页面:response.sendRedirect("--").现在遇到一个问题,网页的地址是带中文的,当执行到跳转命令的 ...
-
select中option的onclick事件失效
html: <select id="pageSelect"> <option value="1" selected onclick=" ...
-
不平衡数据下的机器学习方法简介 imbalanced time series classification
imbalanced time series classification http://www.vipzhuanli.com/pat/books/201510229367.5/2.html?page ...
-
redis持久化数据的机制——转发
转载:https://www.cnblogs.com/xingzc/p/5988080.html Redis提供的持久化机制(RDB和AOF) Redis提供的持久化机制 Redis是一种面向“k ...
-
按值传递 vs. 按指针传递
按值传递还是指针传递? 变量赋值有两种方式:按值传递.按"指针"传递(指针也常称为"引用").不同的编程语言赋值的方式不一样,例如Python是按"指 ...