Как показано в фрагменте кода, который вы включили, двухпараметрическая версия startActivityForResult
вызывает трехпараметрическую версию startActivityForResult
. Трехпараметрическая версия выглядит следующим образом :
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) {
if (mParent == null) {
//...
Instrumentation.ActivityResult ar =
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, this,
intent, requestCode, options);
if (ar != null) {
mMainThread.sendActivityResult(
mToken, mEmbeddedID, requestCode, ar.getResultCode(),
ar.getResultData());
}
if (requestCode >= 0) {
// If this start is requesting a result, we can avoid making
// the activity visible until the result is received. Setting
// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the
// activity hidden during this time, to avoid flickering.
// This can only be done when a result is requested because
// that guarantees we will get information back when the
// activity is finished, no matter what happens to it.
mStartedActivity = true;
}
//...
} else {
//...
}
}
Комментарий в блоке if (requestCode >= 0) {}
описывает, как меняется поведение, когда код запроса >= 0
против < 0
.
Если мы посмотрим на исходный код mInstrumentation.execStartActivity
, мы найдем следующее:
public ActivityResult execStartActivity(
Context who, IBinder contextThread, IBinder token, Activity target,
Intent intent, int requestCode, Bundle options) {
//...
if (am.isBlocking()) {
return requestCode >= 0 ? am.getResult() : null;
}
// ...
}
Строка return requestCode >= 0 ? am.getResult() : null;
возвращает null
ActivityResult
, если requestCode
отрицательно. Возвращаясь к коду startActivityForResult
в верхней части этого ответа, мы видим, что mMainThread.sendActivityResult
вызывается тогда и только тогда, когда ActivityResult
, возвращаемый execStartActivity
, не равен null
. Это sendActivityResult
, что в итоге приводит к вызову onActivityResult
. Итак, путь логики здесь такой:
startActivityForResult
вызывается с отрицательным знаком requestCode
↳ mInstrumentation.execStartActivity
вызывается с отрицательным requestCode
10 mInstrumentation.execStartActivity
возвращает null
10 mMainThread.sendActivityResult
НЕ называется
10 onActivityResult
НЕ называется