startActivityForResult的使用场景是什么?onActivityResult回调里面的resultCode和 requestCode含义是什么?
场景:Activity或者Fragment开启一个新活动,并且希望接收新活动一些信息。比如最常用的选择照片再如选择地址、选择信息等。
resultCode:在新活动里面setResult(int resultCode)用到,系统提供的有RESULT_CANCELED、RESULT_OK、RESULT_FIRST_USER三种,当然也可以自定义数值。
requestCode:在启动Activity时startActivityForResult(Intent intent, int requestCode) 传入请求码,用于在onActivityResult中判断处理结果来自哪个活动。
Activity A启动B的时候,在B中何时该执行setResult ?setResult可以位于Activity的 finish方法之后吗?
回答上面问题之前先简单看下setResult和finish得源码
public final void setResult(int resultCode) {
synchronized (this) {
mResultCode = resultCode;
mResultData = null;
}
}
private void finish(int finishTask) {
if (mParent == null) {
int resultCode;
Intent resultData;
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}
if (false) Log.v(TAG, "Finishing self: token=" + mToken);
try {
if (resultData != null) {
resultData.prepareToLeaveProcess(this);
}
if (ActivityManager.getService()
.finishActivity(mToken, resultCode, resultData, finishTask)) {
mFinished = true;
}
} catch (RemoteException e) {
// Empty
}
} else {
mParent.finishFromChild(this);
}
}
由上面源码可知当我们调用setResult时只是对mResultCode和mResultData进行了赋值,没有做传递参数得工作,真正得数据返回是再finish里面。因此setResult 应该在finish之前调用才起作用,虽然也可以在finish之后调用,但是onActivityResult将无法正常接收数据。
需要注意的几点:
1、被启动的Activity不能放入不同的任务栈,否则会直接调用onActivityResult方法,并且resultCode为0。不过在 Android 5.0 以上 AMS 在处理manifest.xml 文件中的 singleTask 和 singleInstance
信息不会创建新的 任务栈,因此可以收到正常回调。但是在 Android 4.4.4 还是会创建新的任务栈,导致无法正常接收数据。
2、requestCode 必须大于0