onActivityResult這個回調方法在activity中用的非常多,并且一般與startActivityForResult這個方法配合使用蛾娶。
1.startActivityForResult(Intent intent, int requestCode);
第一個參數(shù):一個Intent對象
第二個參數(shù):如果> = 0,當Activity結束時requestCode將歸還在onActivityResult()中。以便確定返回的數(shù)據(jù)是從哪個Activity中返回的疟赊。
2.onActivityResult(int requestCode, int resultCode, Intent data)鞋囊;
第一個參數(shù):這個整數(shù)requestCode提供給onActivityResult,是以便確認返回的數(shù)據(jù)是從哪個Activity返回的钠至,就是在startActivityForResult設置的requestCode葛虐。
第二個參數(shù):這整數(shù)resultCode是由子Activity通過其setResult()方法返回,就是setResult(int resultCode, Intent data)的第一個參數(shù)resultCode棉钧。
一般來說屿脐,resultCode主要指定為RESULT_CANCELED和RESULT_OK ,然后在onActivityResult獲取到resultCode進行判斷宪卿,如果是RESULT_CANCELED就不執(zhí)行回調方法的诵,如果是RESULT_OK 就執(zhí)行回調方法
那么。我們來舉個栗子
有一個activity佑钾,它有諸多按鈕可以跳轉到不同的界面奢驯,就把這個activity先叫做 根activity 吧
在跟activity上點擊button1,可以跳轉到activity1,同樣點擊button2次绘,可以跳轉到activity2瘪阁,同時還都要獲取到activity1或者activity2的返回值顯示出來撒遣,那么我們在button1的點擊事件應該這么寫:
Intent intent = new Intent(RootActivity.this, Activity1.class);
context.startActivityForResult(intent, REQUEST_CODE_ACTIVITY1);
同樣在button2的點擊事件中
Intent intent = new Intent(RootActivity.this, Activity2.class);
context.startActivityForResult(intent, REQUEST_CODE_ACTIVITY2);
REQUEST_CODE_ACTIVITY1和REQUEST_CODE_ACTIVITY2是不相同的兩個int值,標識出兩個不同activity的返回值管跺。
那么在activity1中义黎,如果要設置回調,應該這樣寫
Intent intent = new Intent(Activity1.this, RootActivity.class);
intent.putExtra("pass_data", data);
setResult(RESULT_OK, intent);
finish();
如果不想設置回調事件(比如在Activity1中什么都沒操作點擊返回)豁跑,那么就設置為 setResult(RESULT_CANCELED, intent);
接下來就是重寫RootActivity的onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
switch (requestCode) {
case REQUEST_CODE_ACTIVITY1:
if (resultCode == RESULT_OK) {
if(intent!=null){
//獲取activity1傳遞的數(shù)據(jù)并顯示出來
dosomething;
}
}
break;
case REQUEST_CODE_ACTIVITY2:
if (resultCode == RESULT_OK) {
if(intent!=null){
//獲取activity2傳遞的數(shù)據(jù)并顯示出來
dosomething;
}
}
break;
}
}
接下來再說一種情況廉涕,那就是從RootActivity進入Activity1,再進入Activity2,再進入Activity3這種連續(xù)跨好幾個界面的艇拍,要關閉Activity2后直接進入RootActivity狐蜕,如果不需要傳遞數(shù)據(jù),那么在跳轉的時候就可以直接使用startActivity這個方法來跳轉卸夕。在Activity3中只需要寫如下代碼:
Intent intent = new Intent(Activity3.this, RootActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
第二行代碼的意思是在Activity棧中將在RootActivity之上的所有activity出棧层释。
與剛才一樣,如果同樣是跨多個activity快集,并且需要傳遞數(shù)據(jù)的
話贡羔,在跳轉的時候也直接使用startActivity這個方法來跳轉,不過在Activity3中則需要使用如下代碼:
Intent intent = new Intent(Main3Activity.this, RootActivity.class);
intent.putExtra("pass_data",data);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
setResult(RESULT_OK,intent);
startActivity(intent);
然后在RootActivity中就不能通過onActivityResult接受數(shù)據(jù)了个初。而應該使用onNewIntent這個方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
//從Main3Activity返回的數(shù)據(jù)
String data = intent.getStringExtra("pass_data");
dosomething;
}