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

Sending the User to Another App

2015-07-14 20:51 351 查看

Sending the User to Another App

android的一个重要特性是能够发数据到另一个app,基于一个将要执行

的action。例如,你要在地图上显示一个地址,你可以新建一个

activity来显示。另外,你可以用intent来调用能够在地图上显示地址

的app来显示。

显示意图在你的应用中切换activity。如果在你的应用中查看地图,你

必须使用隐式意图。

这节课向你展示了如何创建一个隐式意图为特定的行动,以及如何使用它

来启动一个活动,在另一个应用程序执行行动。

Build an Implicit Intent

隐式意图不声明组件的类名,而是声明一个行动来执行。操作指定你想要

做的事,如视图、编辑、发送、或得到一些东西。意图往往还包括与行动

相关联的数据,例如你想要查看的地址,或您想要发送的电子邮件消息。

根据你想要创建的意图,数据可能是一个Uri,其他数据类型之一,或意图

可能不需要的数据。

如果您的数据是一个Uri,有一个简单你可以使用定义的操作和数据的

Intent()构造函数。

例如,下面是如何创建一个意图发起电话使用Uri的数据指定电话号码:

Uri number = Uri.parse("tel:5551234");

Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

当应用程序调用此意图通过调用startActivity(),手机应用程序发起调

用给定的电话号码。

这里有几个其他意图及其行动和Uri数据对:

View a map:

// Map point based on address

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,

+Mountain+View,+California");

// Or map point based on latitude/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);

View a web page:

Uri webpage = Uri.parse("http://www.android.com");

Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

其他类型的隐式意图需要“额外的”数据,提供不同的数据类型,如字符

串。您可以添加一个或多个部分的额外数据使用各种putExtra()方法。

默认情况下,系统确定适当的MIME类型,该类型是包含uri数据的意图需

要的。如果intent中uri,你应该用setType()来定义与intent关联的

数据类型。设置MIME类型进一步指定哪些类型的活动应该得到的意图。

这里有一些更多的意图,添加额外的数据指定所需的行动:

Send an email with an attachment:

Intent emailIntent = new Intent(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, new String[] {"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

Create a calendar event:

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类型。这样可以防

止应用程序“视图”其他类型的数据(比如一个地图应用程序)引发的意

图。

Verify There is an App to Receive the Intent

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

虽然Android平台保证某些意图被一个内置的应用程序(如电话、电子邮

件或日历应用程序)解决,您应该总是在一个验证步骤之前调用一个意图



警告:如果你调用一个意图和没有应用程序可用的设备可以处理的目的,

你的应用程序会崩溃。

可用来验证有一个活动,可以应对意图,叫queryIntentActivities()获得

的活动列表能够处理您的意图。如果返回的列表不是空的,您可以安全地

使用意图。例如:

PackageManager packageManager = getPackageManager();

List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

boolean isIntentSafe = activities.size() > 0;

如果isIntentSafe是真的,那么至少有一个应用程序将响应的目的。如果它是假的,那么没有任何应用程序处理的意图。

注意:你应该先执行此检查当你的活动开始。如果你知道一个特定的应用程序可以处理的目的,还可以为用户提供一个链接下载应用程序。

Start an Activity with the Intent

一旦您创建了您的意图和集的额外信息,调用startActivity()来将其发送到系统。如果系统识别可以处理intent的多个活动,,它将显示一个对话框供用户选择使用哪个应用程序,如图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);

}

Show an App Chooser

注意,当你用一个intent来startActivity(),有多个app响应这个intent,用户可以选择使用哪个应用程序在默认情况下(通过选择一个复选框底部的对话框,如图1所示)。这是很好的执行一个操作时,用户通常希望每次都使用相同的应用程序,例如当打开一个web页面(用户可能使用一个web浏览器)或照片(用户可能喜欢一个摄像头)。

然而,如果要执行的操作可能是由多个应用程序来响应和每次用户可能喜欢不同的应用程序来响应每个这样的“共享”行动,因为用户可能有几个应用程序,通过他们中的一个来共享一个东西应该明确显示一个选择器对话框,如图2所示。选择器对话框部队用户选择使用哪个应用程序的每次行动(行动的用户不能选择一个默认的应用程序)。

显示选择器,创建一个意图使用createChooser()并将其传递给startActivity()。例如:

Intent intent = new Intent(Intent.ACTION_SEND);

...

// Always use string resources for UI text.

// This says something like "Share this photo with"

String title = getResources().getString(R.string.chooser_title);

// Create intent to show chooser

Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity

if (intent.resolveActivity(getPackageManager()) != null) {

startActivity(chooser);

}

这将显示一个应用程序列表的对话框来响应意图,该intent传递给createChooser()方法,并提供文本标题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: