android學習(六) 獲取Activity的結果

啓動並不一定是單向的另一個Activity。還可以啓動另一個Activity並接收返回的結果。要接受結果調用startActivityForResult()
響應的Activity必須設計爲返回結果。當他這樣做時,它會作爲另一個Intent對象發送結果。Activity在onActivityResult()回掉中接收它。
:當您調用 startActivityForResult() 時,您可以使用明確或隱含 Intent。當啓動您自己的 Activity 以接收結果時,您應使用明確 Intent 確保您可收到預期結果。


啓動Activity

啓動針對結果的 Activity 時,您所使用的 Intent 對象並沒有什麼特別之處,但您需要向 startActivityForResult() 方法傳遞額外的整數參數

該整數參數是識別您的請求的“請求代碼”。當您收到結果Intent 時,回調提供相同的請求代碼,以便您的應用可以正確識別結果並確定如何處理它。

例如,此處顯示如何開始允許用戶選擇聯繫人的 Activity:

//選擇聯繫人
private void pickContact(){
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts"));
    pickContactIntent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_TYPE);
    startActivityForResult(pickContactIntent,PICT_CONTACT_REQUEST);
}

接收結果

當用戶完成後續Activity並返回時,系統會調用Activity的onActivityResult()方法。此方法有三個參數:
1. 向 startActivityForResult() 傳遞的請求代碼。
2. 第二個 Activity 指定的結果代碼。如果操作成功,這是 RESULT_OK;如果用戶退出或操作出於某種原因失敗,則是 RESULT_CANCELED。
3. 傳送結果數據的 Intent。
例:處理”選擇聯繫人”Intent的結果

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(PICT_CONTACT_REQUEST == requestCode){
            if(resultCode == RESULT_OK) {
                //獲取選擇聯繫人所指的的Uri
                Uri contactUri = data.getData();
                //我們只需要編號列,因爲結果中只有一行
                String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER};
                //在聯繫人上執行查詢以獲取號碼列
                //query()應從單獨的線程來避免阻塞
                //考慮使用CursorLoader執行查詢
                Cursor cursor = getContentResolver().query(contactUri,projection,null,null,null);
                cursor.moveToFirst();
                //從號碼列檢索
                int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                String number = cursor.getString(column);
            }
        }
    }

爲了成功處理結果,您必須瞭解結果的 Intent 的格式。當返回結果的 Activity 是您自己的 Activity 之一時,這便非常容易。 Android 平臺附帶的應用提供它們自己的 API,您可用這些 API 獲取特定結果數據。 例如,“聯繫人”應用始終返回帶內容 URI(識別所選聯繫人)的結果,並且“相機”應用在 “data” extra 中返回 Bitmap。


:在 Android 2.3(API 級別 9)之前,在 Contacts Provider 上執行查詢(如上面所示)需要您的應用聲明 READ_CONTACTS 權限(請參閱安全與權限)。但是,自 Android 2.3 版本開始,“聯繫人”應用授予您的應用在聯繫人提供程序向您返回結果時從聯繫人提供程序臨時讀取信息的權限。 該臨時權限僅適用於所請求的特定聯繫人,因此您只能查詢 Intent 的 Uri 指定的聯繫人,除非您聲明 READ_CONTACTS 權限。


摘自android developer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章