可以通过调用 startActivity() 来启动另一个activity,调用时传递一个描述了所要启动activity的 Intent 。这个intent或是精确指定了所要启动的activity,或是指明了需要执行的action类型 (然后系统会为你选择一个合适的activity,甚至可以是其它应用程序中的activity)。 intent还可以携带少量的数据,这些数据可被所启动的activity使用。
当应用程序运行时,经常会需要能够便捷地启动其它已知的activity。 这只要通过创建一个显式的intent即可,这个intent用类名明确指定了你想要启动的activity。 例如,下面是一个activity如何启动另一个名为SignInActivity的activity:
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
不过,你的应用程序也许还需要执行一些其它的action,比如发送一个email、文本信息或者状态更新信息之类,而这些action又需要用到你的activity中的数据。 这种情况下,你的应用程序本身可能不存在执行这些action的activity,所以你可以 利用本设备上其它应用提供的activity来为你执行这些动作。 这就是intent真正有价值的地方——你可以创建一个说明了你要执行action的intent, 而系统会从其它应用程序中启动一个合适的activity。 如果存在多个activity都能够处理此intent,那么用户可以自己选择一个来执行。 例如,如果你想要允许用户发送一个email信息,可创建如下的intent:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
附加在intent的extra部分中的EXTRA_EMAIL信息是一个有关email目标地址的字符串数组。 当email应用程序响应这个intent时, 它会读取extra部分中的字符串数组并将它们填入撰写email表单中的“to”字段。 在这种情况下,email应用程序的activity将会被启动。并且当用户完成发送后,你的activity将会恢复运行。
启动activity并返回结果
有时你可能需要从你启动的activity里返回一个结果。 这种情况下,请通过调用 startActivityForResult() 来启动一个activity(而不是 startActivity() )。然后,要想从被启动的activity里接收到结果,请实现 onActivityResult() 回调方法。当该activity完成操作后,它会把一个包含结果的 Intent 返回到你的 onActivityResult() 中。
比如,也许你需要用户选取一个联系人,以便于你的activity能够根据联系人信息执行一些操作。下面就是创建intent并处理结果的示例:
private void pickContact() {
// Create an intent to "pick" a contact, as defined by the content provider URI
Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_REQUEST);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// If the request went well (OK) and the request was PICK_CONTACT_REQUEST
if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {
// Perform a query to the contact's content provider for the contact's name
Cursor cursor = getContentResolver().query(data.getData(),
new String[] {Contacts.DISPLAY_NAME}, null, null, null);
if (cursor.moveToFirst()) { // True if the cursor is not empty
int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
String name = cursor.getString(columnIndex);
// Do something with the selected contact's name...
}
}
}
以上例子展示了使用 onActivityResult() 方法来处理activity返回结果的基本逻辑。 第一个判断条件是检查请求是否成功——如果成功了resultCode 应该是RESULT_OK ,以及要求响应的请求是否是可识别的——在这种情况下,requestCode会与传入 startActivityForResult() 的第二个参数相比较。 接下来,代码通过查询Intent 返回的数据(data参数)来处理activity的返回结果。
接下来,ContentResolver 通过content provider执行了一个查询,查询返回了一个包含查到数据以供读取的 Cursor 。详情请参阅Content Providers文档。
关于使用intent的更多信息,请详阅 Intent和Intent过滤器文档。