建立一个隐式意图

来源:互联网 发布:云计算 网络强国 编辑:程序博客网 时间:2024/04/30 08:30

安卓系统最重要的特性之一是一个应用程序用户发送到另一个应用程序的能力基于一个“行动”它想执行。例如,如果您的应用程序有一个业务的地址,你想显示在地图上,你不需要构建一个活动在你的应用程序,展示了一幅地图。相反,您可以创建一个请求来查看地址使用意图。Android系统开始应用,能够显示地址在地图上。

解释在第一节课,建立您的第一个应用程序,您必须使用意图之间导航活动在您自己的应用程序。你通常与一个明确的意图,它定义了组件的具体类名你想开始。然而,当你想要一个单独的应用程序执行一个动作,如“查看地图”,你必须使用一个隐式意图。

这节课向你展示了如何创建一个隐式意图为特定的行动,以及如何使用它来启动一个活动在另一个应用程序执行操作。

建立一个隐式意图

隐式意图不声明组件的类名开始,而是声明一个行动来执行。操作指定了你想做的事,如视图、编辑、发送、或得到一些东西。意图通常还包括数据相关的行动,如地址你想要查看,或者您想要发送的电子邮件消息。取决于你想创造意图,数据可能是一个Uri,其他数据类型之一,或意图可能不需要的数据。

如果您的数据是一个Uri,这是一个简单的意图()构造函数可以使用定义的操作和数据。

例如,下面是如何创建一个意图发起电话使用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 on latitude/longitude//或地图基于纬度/经度点// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom levelIntent mapIntent = new Intent(Intent.ACTION_VIEW, location);
查看一个网页:

Uri webpage = Uri.parse("http://www.android.com");Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);

其他类型的隐式意图需要“额外的”数据,提供不同的数据类型,如字符串。您可以添加一个或多个块额外的数据使用的各种putExtra()方法。

默认情况下,系统确定适当的MIME类型所需要的目的基于Uri的数据包括在内。如果你不包括一个Uri的意图,通常应该使用setType()指定的数据类型与意图。设置MIME类型进一步指定哪些类型的活动应该得到的意图。

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

发送一个电子邮件与附件:

Intent emailIntent = new Intent(Intent.ACTION_SEND);// The intent does not have a URI, so declare the "text/plain" MIME typeemailIntent.setType(HTTP.PLAIN_TEXT_TYPE);emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipientsemailIntent.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//你也可以附加多个项目通过uri的ArrayList
创建日历事件:

Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);Calendar beginTime = Calendar.getInstance().set(2016, 0, 19, 7, 30);Calendar endTime = Calendar.getInstance().set(2016, 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类型的图像/ *。这样可以防止应用程序“视图”其他类型的数据(比如地图应用程序)引发的意图。

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

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

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

验证有一个活动可以应对意图,叫queryIntentActivities()得到的活动列表能够处理您的意图。如果返回的列表不是空的,您可以安全地使用意图。例如:

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

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

注意:你应该先执行此检查当你的活动开始,以防你需要禁用功能,使用意图之前,用户试图使用它。如果你知道一个特定的应用程序可以处理的目的,还可以为用户提供一个链接下载应用程序

开始一个活动的意图

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

startActivity(intent);
这是一个完整的示例,展示了如何创建一个意图查看地图,验证应用程序处理的意图存在,然后启动它:

// Build the intentUri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);// Verify it resolvesPackageManager packageManager = getPackageManager();List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);boolean isIntentSafe = activities.size() > 0;// Start an activity if it's safeif (isIntentSafe) {    startActivity(mapIntent);}

显示应用程序选择器

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

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

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

Intent intent = new Intent(Intent.ACTION_SEND);...
//总是使用UI文本字符串资源。
//这个说类似“与“分享这张照片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);
}
这将显示一个对话框的列表应用程序响应意图传递给createChooser()方法并使用提供的文本标题所示的对话框。


0 0
原创粉丝点击