Как правильно сбросить активность backstack в фоновом режиме? - PullRequest
0 голосов
/ 22 апреля 2019

Недавно я обнаружил проблему в моем приложении, которая зависит от версии Android. Он отлично работает на Android 7.0, но не работает на Android 6.0 (количество платформ, на которых работает приложение, очень ограничено).

В моем приложении есть какие-то трудоемкие операции, выполняемые в фоновом режиме в отдельном потоке Например, операции входа и выхода из системы занимают много времени, поскольку данные приложения должны быть сначала синхронизированы. ProgressDialog отображается во время этих операций, поэтому пользователь не может выполнять какие-либо операции для изменения данных, но все же может блокировать / разблокировать экран.

Когда синхронизация завершена и успешный вход в систему / выход из системы завершен, резервный стек активности сбрасывается. Существуют различные действия для приветствия, регистрации (действительно, вход / выход из системы) и основных экранов. Вот метод для сброса back-стека (выполняется в основном потоке):

public void resetActivityBackStack() {
        final int flags = Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK;
        Intent[] intents;

        switch (state.getSessionState()) {
            case INITIAL:
                intents = new Intent[]{WelcomeActivity.getIntent(context)};
                break;
            case REGISTRATION:
            case INITIALIZATION:
                intents = new Intent[]{WelcomeActivity.getIntent(context), RegActivity.getIntent(context)};
                break;
            default:
                intents = getMainBackStack(context);
        }
        intents[0].setFlags(flags);
        context.startActivities(intents);
    }

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

Проблема заключается в следующем, когда экран заблокирован, этот метод ничего не делает. Поэтому, если пользователь нажимает кнопку входа (и запускает синхронизацию), основной экран блокировки никогда не запускается.

На Android 6.0 я наблюдаю что-то подобное в логах:

2019-04-18 17:31:32,621 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Thu Apr 18 17:32:02 GMT+03:00 2019
2019-04-18 17:31:32,622 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled
2019-04-18 17:31:32,622 [main] DEBUG StateMachine: resetting activity back stack
2019-04-18 17:31:32,623 [pool-7-thread-1] DEBUG SynchronizedState@212568118: handle
2019-04-18 17:31:32,630 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Thu Apr 18 17:32:02 GMT+03:00 2019
2019-04-18 17:31:32,630 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled

На Android 7.0 я наблюдаю это:

2019-04-19 15:37:40,882 [pool-7-thread-1] DEBUG r.i.m.controller.AppController: Intent { act=ru.infotecs.mobileterm.SYNC_ACTION } is scheduled to Fri Apr 19 15:38:00 GMT+03:00 2019
2019-04-19 15:37:40,883 [pool-7-thread-1] DEBUG StateMachine: synchronization is scheduled
2019-04-19 15:37:40,884 [main] DEBUG StateMachine: resetting activity back stack
2019-04-19 15:37:40,929 [main] DEBUG r.i.m.r.trip.TripRegFragment: onStart
2019-04-19 15:37:40,931 [main] INFO  r.i.m.registration.RegActivity: onStart
2019-04-19 15:37:40,933 [main] DEBUG r.i.m.registration.RegActivity: onResume
2019-04-19 15:37:40,935 [main] DEBUG r.i.m.registration.RegActivity: requesting state update
2019-04-19 15:37:40,936 [main] DEBUG r.i.m.r.trip.TripRegFragment: onResume
2019-04-19 15:37:40,937 [main] DEBUG r.i.m.r.trip.TripRegFragment: flushing event queue

Как видите, RegActivity возобновляется, чтобы быть остановленным и замененным действием на главном экране.

Итак, мой вопрос следующий: как правильно сбросить задний стек активности, даже если экран заблокирован или приложение находится в фоновом режиме?

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