安卓应用程序之间的交互
一个典型的安卓应用程序一般有多个activity。每一个activity就是一个用户界面,每个界面允许用户做一些交互性多做(如填写信息、看地图、拍照)。要想从一个activity跳到另个一activity,你就要用到Intent类来定义这个转向及其动作。当你通过Intent告诉系统要打开另一个activity会用到startActivity()方法,系统会用Intent来确认和启动适当的组件。使用Intents甚至可以在一个的activity中打开另一个单独App中的activity。
Intent可以显式的启动一个特定的组件(Activity实例),或隐式的启动任何组件来处理预定义的动作(如:“捕获照片)。
这个类告诉我们怎样用Intent来执行一些和其他程序之间的基本交互,例如启动另一个应用程序,从另个app那接受一个结果,并且能够从其他程序中能够反馈您的程序的意图。
在当前程序中跳到里打开另一个程序。
Android的一个重要特征就是可以让程序根据一个将要执行的“action“来启动另一个程序。例如,在你的程序中想要打开一个地图应用程序,不需要重新建一个activity来显示地图。这样,你可以用Intent来向视图发送一个请求。然后,安卓系统就会启动一个程序在地图上查看地址。
就像先前说的,建立你的第一个app,你可以用Intent在你程序中的多个activity中跳转。你通常会用一个显示的Intent来定义你启动组件的名字。然而,当你想要启动一个action,如查看地图,你必须用一个隐式的Intent。
这一节将讲解怎样为一个特定的action创建一个隐式的Intent,怎样用这个intent来启动一个程序并在里面执行action。
创建一个隐式Intent:
隐式的intents不用声明要启动组件的名字,但却会声明一个将要执行的action。这个action将指定你想要做的动作,如:视图、编辑、发送、或是获得一些事情。Intent有时也会包括关于这个动作的一些数据,如你想查看View的地址,或是你想发送的email信息。依据你想要建立的Intent,这些数据也许是个Uri,或是其他一些数据形式,或者这个intent就不需要任何数据。
如果你的数据是一个uri,下面是一个简单的Intent()构造器,你可以用来定义action和data。
例如:下面是怎样创建一个Intent用uri来启动列出的电话上的号码。
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL,number);
当你的程序利用startActivity()掉用了这个intent,手机程序将会给这个号码拨打电话,
这里是一些其他intents和他们的action 、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 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);
其他隐式类型的Intent需要“额外”的能够提供不同数据类型(如string)的数据。你可以用多个putExtra()方法添加更多的不同类型的数据。
默认情况下,系统会根据带有uri在里面的Intent来确定一个适当的MIME类型。如果你的Intent不报还uri,你通常需要用setType()去指定关于intent的数据类型。设置MIME类型,进一步指明那个活动将要接受这个Intent。
这里是更多的Intent,他附带了额外的数据来指定需要的动作。
用一个附件发送email:
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[]{"[email protected]"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Emailsubject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Emailmessage text");
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse("content://path/to/email/attachment");
// You can also attach multiple items by passing anArrayList 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, "Ninjaclass");
calendarIntent.putExtra(Events.EVENT_LOCATION,"Secret dojo");
注意:1.这个intent的创建日历表时间只在API 14或更高支持
2.把你的intent定义的非常详细是很重要的。例如,如果你想要用ACTION_VIEW显示一个图片,你需要指明“image/*”的MIME类型。这样可以阻止程序中从一个被触发的Intent看到其他的数据(像一个地图程序)。
用Intent开始一个Activity
一但你创建了Intent并给他设置了数据信息,调用startActivity
()方法来传递给系统。如果系统识别对于一个activity能够操作这个intent,他将显示一个选择性的dialog(如下图)让用户做出选择。否则,将直接打开将要启动的程序。
startActivity(intent);
这里是一个完整的例子,展示了怎样建立intent来打开地图,确认有一个程序可以操作这个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
boolean isIntentSafe = activities.size() > 0;
// Start an activity if it's safe
if (isIntentSafe) {
startActivity(mapIntent);
}
显示一个应用程序选择器
当你通过传递Intent到startActivity()启动一个activity,有多个程序来响应这个Intent时,用户可以选择一个默认的程序(在一个dialog底部选择默认如上图)。这样会很方面当用户经常打开同一个应用程序,例如,当打开一个网页(用户一般喜欢用同一个浏览器),或是拍照(用户喜欢用同一个照相机)。但是,如果展示的action可以被多个程序操作,用户喜欢每次用不同的程序(如分享操作),这些需要每次都显示一个dialog来让用户选择要用的程序(用户不能选择哪个默认的app)。
下面代码是怎样显示选择器,用createChooser()创建一个intent,然后传递给startActivity(),例如:
Intent intent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text. This sayssomething 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);
这些将会显示一个带有多个可以反馈给这个Intent的程序列表的dialog,然后传递给createChooser()方法,并用一些好的字符作为他的标题。
原文章地址:http://developer.android.com/training/basics/intents/index.html