Недавно я обнаружил проблему в моем приложении, которая зависит от версии 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
возобновляется, чтобы быть остановленным и замененным действием на главном экране.
Итак, мой вопрос следующий: как правильно сбросить задний стек активности, даже если экран заблокирован или приложение находится в фоновом режиме?