Начать действие для кода запроса результата в проекте библиотеки - PullRequest
0 голосов
/ 13 декабря 2018

В настоящее время я работаю над библиотечным проектом для Android, который планирую открыть с открытым исходным кодом.В библиотеке есть действие, для которого мне нужно вернуть результат, поэтому приложение, использующее библиотеку, должно будет вызвать startActivityForResult.

Мой вопрос: если у пользователя есть действие в его приложении, которое вызывает второе действие в своем собственном приложении, которое также должно возвращать результат, и это действие должно вызвать действие из моей библиотеки, мойактивность библиотек и их собственная активность будет использовать тот же обратный вызов onActivityResult.Есть ли способ избежать моего кода запроса активности, не конфликтующего с одним из их собственных кодов запроса, это просто случай предположить, что их собственные коды запроса равны 1, 2, 3 и т. Д., И я начинаю свой код запроса активности библиотек с некоторого произвольногочисло, например 1000.

Это просто так, или это лучший способ избежать конфликта моего кода запроса для моей библиотеки с кодом запроса действий других приложений?

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

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не использует один и тот же код запроса для разных типов запросов, все хорошо.

0 голосов
/ 13 декабря 2018

Я думаю, что в библиотеке должен быть параметр для указания кода запроса самим разработчиком для startActivityForResult, чтобы они никогда не могли конфликтовать в том же действии или фрагменте, из которого они были вызваны.

...