Activity
A может выбирать свои собственные коды запросов, а Activity
B никогда не узнает, какой код запроса используется A.
Что не проблема, поскольку коды запросов являются чисто локальными.Каждый экземпляр Activity
отделен от других экземпляров Activity
- они не будут перепутаны только потому, что все они реализуют один и тот же метод (например, onCreate()
или в вашем случае onActivityResult()
).
Давайте посмотрим на некоторые строки из исходного кода для android.app.Activity , начиная со строки 4614
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
@Nullable Bundle options) {
if (mParent == null) {
options = transferSpringboardActivityOptions(options);
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;
}
cancelInputsAndStartExitTransition(options);
// TODO Consider clearing/flushing other event sources and events for child windows.
} else {
if (options != null) {
mParent.startActivityFromChild(this, intent, requestCode, options);
} else {
// Note we want to go through this method for compatibility with
// existing applications that may have overridden it.
mParent.startActivityFromChild(this, intent, requestCode);
}
}
}
Комментарии в фрагменте цитируемого кодапоказать, что код запроса используется для определения, есть ли результат, который должен быть возвращен.
Обратите внимание, что параметры для startActivityForResult(Intent intent, int requestCode, Bundle options)
передаются в метод execStartActivity()
из класса Instrumentation
в том жепакет android.app .
Но в execStartActivity()
есть еще четыре параметра, которые служат для идентификации вызывающего приложения и текущего экземпляра Activity
(я не буду здесь вдаваться в подробности структуры Binder, но есть, например, видео на YouTube на эту тему):
Context who, IBinder contextThread, IBinder token, Activity target
Опять же, код запроса используется только для определения, есть ли результат, который должен быть возвращен (для отрицательного кода запроса, startActivityForResult()
обрабатывается так же, как startActivity()
)
return requestCode >= 0 ? am.getResult() : null;
Кроме того, код запроса просто передается обратно в Activity
, который вызывается startActivityForResult()
.
Так что если Activity
не использует один и тот же код запроса для разных типов запросов, все хорошо.