您的位置:首页 > 移动开发 > Android开发

跟Google学习Android开发-起始篇-与其它应用程序交互(1)

2013-06-22 12:50 375 查看

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

· 创建一个日历事件:

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
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");

注:此意图日历事件仅在API级别14和更高版本中支持。

注:你尽可能具体地定义你的意图是很重要的。例如,如果你想使用ACTION_VIEW意图显示图像,你应该指定MIME类型为
image/*
。这可以防止那些能“查看”其他类型的数据的应用程序(例如地图应用程序),被意图触发。

验证有一个应用程序能接收意图

尽管Android平台保证某些意图将由某个内置的应用程序解决(如电话、电子邮件或日历应用程序),你应该总是在调用意图之前包括验证的步骤。

注意:如果你调用一个意图,而设备上没有任何的应用程序可以处理这个意图,你的应用程序将会崩溃。

要想验证是否有一个有效的活动可以响应的意图,可调用queryIntentActivities()得到一个能够处理你的意图的活动列表。如果返回的列表不为空,你可以放心地使用的意图。例如:

PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;

如果
isIntentSafe
,那么至少有一个应用程序将响应该意图。如果它为
,那么就不会有任何的应用程序来处理这个意图。

注:您的活动第一次启动时你应该执行此检查,以防你需要在用户尝试使用它之前禁用该意图的功能。如果你知道一个特定的应用程序可以处理这个意图,你也可以提供一个链接供用户下载此应用程序(请参阅如何链接您的产品到Google Play)。

用意图启动一个活动






图1。一个以上的应用程序可以处理意图时出现选择对话框时的示例。

一旦你创建了你的意图,并设置了extra信息,调用startActivity()将它发送到系统。如果系统识别到多个活动可以处理这个意图,它会显示一个对话框供用户选择使用哪个应用程序,如图1所示。如果只有一个活动能处理意图时,系统立即启动它。

startActivity(intent);

下面是一个完整的例子,显示了如何创建一个意图来查看地图,确认存在一个应用程序来处理这个意图,然后启动它:

// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);

// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe
if (isIntentSafe) {
startActivity(mapIntent);
}

显示一个应用程序选择器






图2当你使用createChooser()来确保总是向用户显示回应你的意图的应用程序列表时,出现选择对话框的示例。

请注意,当你传递你的意图到startActivity()来启动一个活动时,有一个以上的应用程序响应你的意图,用户可以选择默认使用的应用程序(通过选择对话框底部的一个复选框;参见图1)。当用户通常希望每次使用相同的应用程序来执行操作时,如打开一个网页时(用户可能只使用一个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()方法的意图的应用程序列表,并使用提供的文本作为对话框的标题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: