安卓应用程序之间的交互

安卓应用程序之间的交互

一个典型的安卓应用程序一般有多个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()构造器,你可以用来定义actiondata

例如:下面是怎样创建一个Intenturi来启动列出的电话上的号码。

 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 activities =packageManager.queryIntentActivities(mapIntent, 0);

boolean isIntentSafe = activities.size() > 0;

// Start an activity if it's safe

if (isIntentSafe) {

startActivity(mapIntent);

}

显示一个应用程序选择器

当你通过传递IntentstartActivity()启动一个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

你可能感兴趣的:(安卓应用程序之间的交互)