Почему onActivityResult () вызывается только когда requestCode> = 0? - PullRequest
1 голос
/ 22 марта 2019

Как мы можем знать, метод startActivity будет вызван startActivityForResult метод;И некоторый код, как показано ниже:

    /**
 * Same as calling {@link #startActivityForResult(Intent, int, Bundle)}
 * with no options.
 *
 * @param intent The intent to start.
 * @param requestCode If >= 0, this code will be returned in
 *                    onActivityResult() when the activity exits.
 *
 * @throws android.content.ActivityNotFoundException
 *
 * @see #startActivity
 */
public void startActivityForResult(@RequiresPermission Intent intent, int requestCode) {
    startActivityForResult(intent, requestCode, null);
}

Я стараюсь изо всех сил, чтобы найти исходный код, где имеют дело код запроса.Но я ничего не нашел.Может ли кто-нибудь скопировать исходный код и сказать, как он работает, когда вызывается только requestCode> = 0 OnActivityResult ()?

1 Ответ

1 голос
/ 22 марта 2019

Как показано в фрагменте кода, который вы включили, двухпараметрическая версия 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 НЕ называется

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...