关于 startActivityForResult

startActivityForResult的使用场景是什么?onActivityResult回调里面的resultCode和requestCode含义是什么?

  • 场景:如果你希望启动另一个 Activity 并接受返回的结果,需要调用 startActivityForResult() 方法。例如:你启动照相应用并需要接收拍摄的照片最为结果;你启动联系人应用并需要接收联系人详情信息最为结果。
  • requestCode:当你想启动一个带有返回结果的 Activity 的时候,你需要传递额外的参数,这就是调用 startActivityForResult() 时,需要传递的 requestCode —— 请求码,该参数用于识别的你的请求的请求码。当你收到 Intent 结果是,回调会提供相同的请求码,以便你的应用可以正确识别结果并确定如何处理它。
  • resultCode:当用户完成后续 Activity 并返回时,系统会调用你的 Activity 的 onActivityResult() 方法,该方法包括三个参数,其中一个就是 resultCode —— 结果码。如果操作成功,结果是 RESULT_OK;如果用户退出或操作处于某种原因失败,则结果是 RESULT_CANCELED。

Activity A启动B的时候,在B中何时该执行setResult ?setResult可以位于Activity的finish方法之后吗?

  • 当 Activity 存在时,它为了返回数据给调用它的 Activity,可以调用 setResult() 方法。这个参数必须是系统所支持的结果码,它可以是标准的结果码,RESULT_CANCELED, RESULT_OK,或者任何自定义的从 RESULT_FIRST_USER(这个值是 1,也就是说可以自定义大于 1 的任何 int 类型的数)开始的值。此外,这个方法(setResult())可以选择一个包含任何它想要的数据的 Intent 对象返回。所有这些信息返回给调用它的 Activity 的 onActivityResult() 方法中,以及它最初传递过来的值(请求码)。
  • 可以通过源码解释第二个问题,以下是 Activity 源码摘要
1
2
3
4
5
public static final int DONT_FINISH_TASK_WITH_ACTIVITY = 0;
public void finish() {
finish(DONT_FINISH_TASK_WITH_ACTIVITY);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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);
}
}

以上是摘要了 Activity 的 finish() 和它的重载的方法。在带参数的方法中,可以看到如下代码段:

1
2
3
4
synchronized (this) {
resultCode = mResultCode;
resultData = mResultData;
}

这段代码说明了,Activity 在关闭自己之前会将结果码和返回参数赋值,之后结束自己并返回,结果码初始值为 0,对应的是 RESULT_CANCELED 的值,因此,在 finish() 方法后再设置结果码,显然是不行的,如果如此做,调用方会收到失败的结果(RESULT_CANCELED)。

结论:setResult() 方法不能再 finish() 方法后调用。

坚持原创技术分享,您的支持将鼓励我继续创作!