你能夠通過調用startActivity()方法來啟動另外一個Activity,在調用這個方法時要給它傳遞一個你想要啟動的描述Activity的Intent作為參數。這個Intent既可以確切的指定你想要啟動的Activity,也可以是你想要執行的動作的類型的描述(系統會給你選擇相應的Activity,甚至可以從不同的應用程式中選擇)。Intent也能夠攜帶少量的用於啟動Activity所需的資料。
當在自己的應用程式中工作時,你會經常的需要簡單載入一個已知的Activity,你能夠使用類名,通過建立一個你想啟動的明確定義的Activity的Intent來做這件事。例如,下面的例子說明了怎樣啟動一個名叫SignInActivity的Activity。
Intent intent = new Intent(this, SignInActivity.class);
startActivity(intent);
你的應用可能要執行諸如發送郵件、簡訊,或使用來自你的Activity的資料更新狀態等動作,而你的應用程式中可能沒有自己的執行這些動作的Activity,因此你能夠使用裝置上其他應用程式提供的Activity來替你執行這些動作,這是Intent的真正價值---你能夠建立一個描述你想執行的動作的Intent,這樣系統就會從其他應用程式中載入響應的的Activity。如果有多個能夠處理這個Intent的Activity,那麼使用者能夠選擇其中之一來使用。例如,如果你想允許使用者發送一個郵件訊息,你能夠建立下面這樣的Intent:
Intent intent = new Intent(Intent.ACTION_SEND);
Intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
startActivity(intent);
附加給Intent的EXTRA_EMAIL是一個要發送郵件的郵件地址字元數組,當郵件應用程式響應這個Intent時,它會讀附加物中提供的字元數組,然後把它們放到郵件格式的”to”欄位中。在這個案例中,郵件應用程式的Activity被啟動,當使用者發送郵件,你的Activity被恢複。
為了某個結果啟動一個Activity
某些時候,你可能想要接受來自你啟動的Activity的執行結果,通過調用startActivityForResult()方法來啟動Activity可以到達這個目的(而不是startActivity()方法)。要從後續的Activity中接受執行結果,你必須實現onActivityResult()回調方法,當後續的Activity執行完成,它會在Intent中返回一個結果給你的onActivityResult()方法。
例如,你也許想要使用者來選擇一個通訊錄,以便你的Activity能夠用這個通訊錄做一些事情。下面的例子說明了怎樣建立這樣的Intent和處理這個結果:
Private void pickContack(){
//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...
}
}
}
這個列子展示了為了處理Activity結果在onActivityResult()方法中應該使用的基本邏輯。首先鍵請求結果是否成功---如果成功,那麼resultCode將是RESULT_OK,同時判斷響應的結果是否是請求已知的(在這個例子中,requestCode和用startActivityForResult()方法的第二個參數進行匹配),接下來,代碼通過查詢Intent返回的資料來處理Activity的返回結果。
ContentResolver執行的查詢與內容提供的區別是,它返回一個允許查詢資料的遊標來讀取資料,關於更多資訊,請查看Content Providers(內容提供器)文檔。
關於使用Intent的更多資訊,請查看Intents and Intent Filters(Intents和Intent過濾器)文檔