Подтвердить что ты не робот

Проблема упорядочения стека событий при запуске приложения из установщика приложений Android и с главного экрана

Только для тестирования, я разрешаю загружать и устанавливать приложение APK через URL-адрес. После загрузки по телефону его можно запустить с помощью установщика приложений для Android, который дает пользователю возможность установить его на свое устройство и затем запустить.

Рассмотрите, загрузили ли мы и запустили приложение так, как описано выше. Главная/запуск в моем приложении - это страница входа в систему (Activity A). Как только пользователь аутентифицирован, они переходят в основную область приложения, например. Activity B. Итак, текущий текущий стек этой задачи A > B.

Затем я нажимаю кнопку "домой" на телефоне и вывозум на главный экран Android. Я снова запускаю приложение через значок в меню, и меня берут в Activity A вместо Activity B. Либо стек действия теперь A > B > A, либо теперь есть две отдельные задачи со стеками активности A > B и A соответственно. Я хочу, чтобы вернуться к Activity B, когда я перезапустил приложение. Нажатие назад, пока в этом состоянии вернет меня к Activity B.

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

Я посмотрел, как начинаются действия каждого механизма. Когда мы используем программу установки приложений, мы видим следующие журналы:

INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) }
INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] }

через панель запуска/домашний экран:

INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] }

При запуске с установщиком мы видим, что он использует флаг 0x10000000, но при запуске с помощью пусковой установки мы видим, что он использует 0x10200000. Он также использует категорию намерений.

Из docs мы видим, что флаги:

public static final int FLAG_ACTIVITY_NEW_TASK
Constant Value: 268435456 (0x10000000)

public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
Constant Value: 2097152 (0x00200000)

Флаг FLAG_ACTIVITY_RESET_TASK_IF_NEEDED (который используется, когда приложение запускается из панели запуска), как правило, препятствует созданию новой задачи, если она уже существует, и будет восстанавливать последнее использованное действие. Это желаемое поведение. Почему это не работает в этой ситуации? Есть ли что-нибудь, что я могу сделать, чтобы убедиться, что мое приложение всегда будет возвращать меня в последнее действие независимо от того, было ли оно запущено с помощью программы установки/запуска приложения?

Если я использую singleTask, он всегда будет возвращать меня к основной активности (Activity A) всякий раз, когда я запускаю приложение (что тоже нежелательно).

Вот вопрос, который я нашел, когда кто-то сталкивается с подобной проблемой (у которой нет принятого ответа): Приложение теряет способность запоминать свой стек при запуске из другого приложения

EDIT: проверка флага FLAG_ACTIVITY_BROUGHT_TO_FRONT в onCreate() нашей активности запуска (а затем завершение, если она установлена), по-видимому, фиксирует основной симптом, но, очевидно, основная проблема все еще существует. Есть ли более полное исправление?

EDIT2: тот же результат возникает, когда вы загружаете/запускаете приложение из Android Market, поэтому некоторые из приведенных выше сведений могут быть неактуальными.

4b9b3361

Ответ 1

Добавлен ответ, который предоставил антонит:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {
        // Activity was brought to front and not created,
        // Thus finishing this will get us to the last viewed activity
        finish();
        return;
    }

    // Regular activity creation code...
}

Ответ 2

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

Ваше исправление (или что-то вроде this), вероятно, лучше всего.

Ответ 3

Ваша проблема, скорее всего, связана с тем, что установщик приложений не использует категорию LAUNCHER, как и панель запуска.

Эта ошибка была зарегистрирована в другом месте:

Приложение всегда запускается из корневой активности, а не возобновляет фоновое состояние (известная ошибка)