startActivityForResult和setResult詳解
tartActivityForResult與startActivity的不同之處在於:
1、startActivity( )
僅僅是跳轉到目標頁面,若是想跳回當前頁面,則必須再使用一次startActivity( )。
2、startActivityForResult( )
可以一次性完成這項任務,當程式執行到這段程式碼的時候,假若從T1Activity跳轉到下一個Text2Activity,而當這個Text2Activity呼叫了finish()方法以後,程式會自動跳轉回T1Activity,並呼叫前一個T1Activity中的onActivityResult( )方法。
相關函式:
startActivityForResult(Intent intent, Int requestCode)
setResut(int resultCode, Intent intent)
onActivityResult(int requestCode, int resultCode, Intent intent)
簡單例子介紹:
1.跳轉的時候不是採用startActivity(intent) 這個方法,而是startActivityForResult(intent, 0)
Intent intent=new Intent();
intent.setClass(A.this, B.class);
Bundle bundle=new Bundle();
String str1="aaaaaa";
bundle.putString("str1", str1);
intent.putExtras(bundle);
startActivityForResult(intent, 0);//這裡採用startActivityForResult來做跳轉,此處的0為一個依據,可以寫其他的值,但一定要>=0
2.重寫onActivityResult方法,用來接收B回傳的資料。
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) { //resultCode為回傳的標記,我在B中回傳的是RESULT_OK
case RESULT_OK:
Bundle b=data.getExtras(); //data為B中回傳的Intent
String str=b.getString("str1");//str即為回傳的值
break;
default:
break;
}
}
3.在B中回傳資料時採用setResult方法,並且之後要呼叫finish方法。
setResult(RESULT_OK, intent); //intent為A傳來的帶有Bundle的intent,當然也可以自己定義新的Bundle
finish();//此處一定要呼叫finish()方法
Android activity的setResult()在什麼時候呼叫(重點也是難點)
如果在startActivityForResult起來的Activity裡面設定setResult,結果並不會馬上返回給parent的Activity,只有當前Activity被finish,結果才會被髮送給parent的onActivityResult去處理!
如果一個activity要返回資料到啟動它的那個activity,可以呼叫setResult()方法。那什麼時候去呼叫setResult()方法返回資料呢?
看一下原始碼就明白了
public final void setResult(int resultCode, Intent data) {
synchronized (this) {
mResultCode = resultCode;
mResultData = data;
}
}
public void finish() {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (Config.LOGV) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (ActivityManagerNative.getDefault()
.finishActivity(mToken, resultCode, resultData)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
這段程式碼可以看出activity返回result是在被finish的時候,也就是說呼叫setResult()方法必須在finish()之前。
那麼如果在如下方法中呼叫setResult()也有可能不會返回成功: onPause(), onStop(), onDestroy(),
因為這些方法呼叫不一定是在finish之前的,當然在onCreate()就呼叫setResult肯定是在finish之前的
按BACK鍵從一個Activity退出來的,一按BACK,android就會自動呼叫Activity的finish()方法,然後設定resultCode為RESULT_CANCELED,也就不會返回任何資料了 .
解決方法就是在Activity裡面捕獲按BACK的事件,捕獲到之後先setResult,然後自己來呼叫finish,就搞定了……把BACK事件直接自己給吞了
@Override
public void onBackPressed() {
Log.i(TAG, "onBackPressed");
setResult(Const.LIVE_OK);
super.onBackPressed();
}
當然還可以在onCreate()就呼叫setResult,不過我覺得這種方法沒有重寫onBackPressed()方法好.
轉自:http://www.cnblogs.com/lijunamneg/archive/2013/02/05/2892616.html
相關文章
- android StartActivityForResult()方法詳解Android
- startActivityForResult()和onSaveInstanceState()用法
- startActivityForResult小坑
- 關於startActivityForResult
- Activity的startActivityForResult
- activity和fragment中startactivityforresult方法的區別Fragment
- 有來有去 startActivityForResult()
- Android應用開發—setResult()的呼叫時機Android
- Fragment中呼叫startActivityForResult的那些坑Fragment
- DR和BDR詳解
- 詳解 let 和 var
- require 和 import 詳解UIImport
- exp和imp詳解
- 詳解jdbcTemplate和namedParameterJdbcTemplateJDBC
- xargs 和 exec詳解
- jni和ndk詳解
- ckeckpoint和SCN詳解
- Activity回傳資料方法startActivityForResult onActivityResult
- ROP漏洞詳解和利用
- WebRTC SDP 詳解和剖析Web
- pandas qcut 和cut 詳解
- [譯]KVC 和 KVO詳解
- cookie和session的詳解CookieSession
- HTTP和HTTPS詳解HTTP
- iOS KVC和KVO詳解iOS
- rowspan和colspan用法詳解
- HTTP和HTTPS詳解。HTTP
- IP校驗和詳解
- RabbitMQ的詳解和使用MQ
- 介面和抽象類詳解抽象
- Android startActivityForResult()廢棄了,代替方案案例Android
- android WebView詳解,常見漏洞詳解和安全原始碼AndroidWebView原始碼
- Vue $dispatch 和 $broadcast 詳解VueAST
- crontab和cron表示式詳解
- Git詳解和Github的使用Github
- Promise和async await詳解PromiseAI
- onSaveInstanceState和onRestoreInstanceState詳解REST
- javascript原型和原型鏈詳解JavaScript原型