可以通过调用 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过滤器文档。