本文译自:http://developer.android.com/training/basics/intents/sending.html
Android的重要特性之一就是基于要执行的特定的“action”把用户带入另外一个应用程序。例如,如果你的应用程序有一个要在地图上显示的地址,你不必在你的应用程序创建一个用于显示地图的Activity。相反,你可以使用Intent对象给地图应用程序的View创建一个请求,然后Android系统就会启动对应的应用程序,病在地图上显示你给出的地址。
在讲解第一课时---创建你的第一个应用程序,在你自己的应用程序中的Activity间,你必须使用Intent对象来导航。通常要使用明确的Intent对象,其中明确的定义了你想要启动的组件的类名。但是,当你要实行不同的应用程序中的一个操作时,你必须要使用一个隐含的Intent对象。
本节课会告诉你如何给一个特殊的操作创建一个隐含的Intent对象,以及如何使用这个对象来启动另外一个应用程序中Activity来执行对应的操作。
创建一个隐含的Intent对象
隐含的Intent对象不会声明要启动的组件的类名,相反它会声明一个要执行的操作。这个操作指定了你想要做的事情,如浏览、编辑、发送或获取某些事情。Intent对象还经常会包括跟操作相关联的数据,如你想要浏览的网址,或要发送Mail的电子邮件地址。根据你创建的Intent,关联的数据可以是一个Uri,这是最常见的几种数据类型之一,或者也完全可以不需要数据。
如果你的数据时一个Uri,那么就可以简单的使用Intent()构造器来定义操作和数据。
例如,下例代码创建了一个Intent对象,它会使用Uri中指定的电话号码来启动电话呼叫程序:
Uri number=Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
当你的应用程序通过调用startActivity()方法来调用这个Intent对象时,电话应用程序会使用给定的号码来发起一个呼叫。
以下是另外两个Intent的操作和Uri数据对:
1. 浏览一个地图
// 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);
2. 浏览一个网页
Uri webpage =Uri.parse("http://www.android.com"); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
隐含的Intent对象还会要求提供不同数据类型的额外数据,如字符串。你可以使用各种putExtra()方法来添加一个或多个额外数据。
默认情况下,系统会通过一个Intent对象上的Uri所包含的数据来判断对应的MIME类型,如果你没有在Intent对象中包含Uri,那么通常你应该使用setType()方法来指定跟Intent对象关联的数据的类型。设定MIME类型会进一步指定由那种类型的Activity来接收Intent对象。
以下是一些给指定的操作添加额外数据的Intent对象:
1. 发送带有附件的email:
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, 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
2. 创建一个日历事件:
Intent calendarIntent=newIntent(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");
注意:这个针对日历事件的Intent对象只在API level 14以上的版本才会被支持。
注意:重要的是,你要尽可能的具体的了解你要定义的Intent对象。例如,如果你想要使用ACTION_VIEW类型Intent来显示一张图片,那么你应该指定一个image/*的MIME类型。这样会防止能够浏览其他类型数据应用程序被这个Intent对象所触发。