最近在做项目的过程中有需要用到返回值,但是由于需求比较复杂,感觉把setResult放到onStop中比较方便,但是发现在onStop中写入setResult(。。。)和finish()之后,跟本就不会回传值,后来又试了onPaulse和onDestroy均是不可以。
后来发现是因为错过了onActivityResult的调用时机,
拿B返结果给A作示例:
B—onPause
A—onActivityResult
A—onRestart
A—onStart
A—onResume
B—onStop
B—onDestroy
从上面过程可以看出,首先是B处于Pause 状态,然后等待A执行 onRestart——> onStart ——〉onResume,然后才是B 的onSstop——>onSdestroy,而A的 onActivityResult() 需要在B的onPause之后,A的onRestart之前这中间调用,所以B中的setResult()函数应该放在B的onStop之前调用。
另外我试验了一下,如果把setResult()放在 B 的 onPause() 里面调用,结果仍然是无效的。
那么setResult()应该在什么时候调用呢?从源码可以看出,Activity返回result是在被finish的时候,也就是说调用setResult()方法必须在finish()之前。所以在onPause、onStop、onDestroy方法中调用setResult()也有可能不会返回成功,因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的,但是又不满足业务需要。
//以下是我测试是否可以返回result示例代码,结果显示,放到这三个位置都是不可以的。
private void goBack(int i){
Intent intent = new Intent();
intent.putExtra("index", ""+i);
setResult(1,intent);
finish();
}
@Override
protected void onPause() {
super.onPause();
Log.d("haha",">>>>>"+"onPause");
goBack(5);
}
@Override
protected void onStop() {
super.onStop();
Log.d("haha",">>>>>"+"onStop");
// goBack(6);
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("haha",">>>>>"+"onDestroy");
// goBack(7);
}