安卓 onActivityResult獲取返回值
情景: Activity 1 啟動Activity 2, 想要獲取Activity2中的值返回給Activity1.
也就是三個步驟:
- Activity 1 啟動Activity 2
- Activity 2 中給 Activity 1傳值
- Activity 1 用onActivityResult獲取返回值。
onActivityResult獲取返回值有兩種情況:
- Intent是顯式(同一個應用內部的Activity之間切換)
- Intent是隱式(調取應用之外的活動等,比如發簡訊/打電話/發郵件等)
可以參考之前的筆記:https://www.jianshu.com/p/74441a115b42
對於顯式Intent
我們知道,通常ActivityA啟動ActivityB使用以下方法(不要返回值):
(Activity A中)
public void toSecond(View view) { Intent intent=new Intent(this,SecondActivity.class); startActivityForResult(intent); }
那麼要想得到SecondActivity的返回值應該怎麼做呢?
(Activity A中):
final int RESULT_CODE=101; final int REQUEST_CODE=1; public void toSecond(View view) { Intent intent=new Intent(this,SecondActivity.class); startActivityForResult(intent, REQUEST_CODE); }
然後需要重寫onActivityResult(int requestCode, int resultCode, Intent data) 方法, 其中:
- requestCode 是用於標識所啟動的Activity的唯一識別符號,和上面的REQUEST_CODE是同一個值,在onActivityResult方法中要與REQUEST_CODE進行比較以判斷返回的是不是該Activity;
- resultCode是結果編號,Activity B 返回的鍵 (在顯式Intent中,該值= REQUEST_CODE);
- data 就是所接受到的返回的值:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode==REQUEST_CODE) { if(resultCode==RESULT_CODE) { String result=data.getStringExtra("second"); textView.setText(result); } } super.onActivityResult(requestCode, resultCode, data); }
(Activity B中)
這個裡面的RESULT_CODE、intent分別跟上段程式碼中onActivityResult()方法中的第二個、第三個引數相對應。
- RESULT_CODE 使用者告訴對方自己的唯一識別符號
- intent 用於傳送內容
final int RESULT_CODE=101; public void sendToFirstActivty(View view) { Intent intent=new Intent(); intent.putExtra("second", "I am second!"); setResult(RESULT_CODE, intent); finish(); }
對於隱式Intent
對於隱式Intent來說,呼叫的不是自己內部指定的Activity,處理方法中,只有一個區別: requestCode還有系統自帶的一些引數:表示成功獲得。也就是說,如果我們啟動的intent是隱式意圖,那麼可以用Activity類中RESULT_OK來表示操作已經順利結束。 (此處,requestCode = RESULT_OK)
借用網上例子:
final int CROP_PIC_REQUESTCODE = 23; final int SELECT_PICTURE = 21; if ( requestCode == SELECT_PICTURE && resultCode == RESULT_OK) { System.out.println("呼叫相簿返回,關閉activity"); Intent intent1 = new Intent("com.android.camera.action.CROP"); intent1.setDataAndType(data.getData(), "image/*"); intent1.putExtra("crop", "true"); intent1.putExtra("aspectX", 1); intent1.putExtra("aspectY", 1); intent1.putExtra("outputX", 80); intent1.putExtra("outputY", 80); intent1.putExtra("return-data", true); startActivityForResult(intent1, CROP_PIC_REQUESTCODE); }
其他判斷操作狀態的識別符號還有:
/** Standard activity result: operation canceled. */ public static final int RESULT_CANCELED = 0; /** Standard activity result: operation succeeded. */ public static final int RESULT_OK = -1; /** Start of user-defined activity results. */ public static final int RESULT_FIRST_USER = 1;
參考:https://blog.csdn.net/qq_29134495/article/details/51505278