Обработка изменения размера дисплея - PullRequest
0 голосов
/ 20 декабря 2018

Я переношу целевую версию SDK моего приложения на Android Oreo.

Одно из изменений, которые могут повлиять на приложение, заключается в том, что если изменить размер дисплея устройства, приложение, ориентированное на Android-нугу и выше, будетбыть уведомленным, как будто есть изменение ориентации устройства.Ниже приведен источник.

При изменении плотности устройства система уведомляет о запуске приложений следующими способами:

Если приложение предназначено для уровня API 23 или ниже, система автоматически убиваетвсе его фоновые процессы.Это означает, что если пользователь отключается от такого приложения, чтобы открыть экран «Настройки», и изменяет настройку «Размер экрана», система убивает приложение так же, как и в случае нехватки памяти.Если приложение имеет какие-либо процессы переднего плана, система уведомляет эти процессы об изменении конфигурации, как описано в разделе Обработка изменений времени выполнения, так же, как если бы ориентация устройства изменилась.Если приложение предназначено для Android 7.0, все его процессы (основной и фоновый) уведомляются об изменении конфигурации, как описано в разделе Обработка изменений времени выполнения.

Теперь в моем приложении есть длительный процесс, который выполняется в асинхронном режиме.TSak в деятельности Android.Это означает, что приложение имеет AsyncTask, который находится внутри кода активности.

Я создаю диалоговое окно в начале задачи Async и скрываю его, когда задача Async выполнила свою работу.

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

Ориентация моего приложения привязана к портретной.

Как мне справиться с таким сценарием?Любая помощь приветствуется.Спасибо!

РЕДАКТИРОВАТЬ: Это сценарий

1) Запуск приложения

2) Главный экран

3) Пользователи нажимают кнопку

4) AsyncTask внутри главного экрана запущен

5) Отображается диалоговое окно с ходом выполнения задачи

6) Пользователь сворачивает приложение и переходит к настройке

7) Изменяет размер дисплея / плотность или изменяет размер шрифта устройства

8) Мое приложение вызывается ОС таким образом, как если бы изменилось вращение устройства

9) Затемпользователь возвращается обратно в приложение

10) Но показанное диалоговое окно больше не отображается

11) Но асинхронная задача работает в фоновом режиме и все еще выполняет свою задачу

12) Задача фактически выполнена, но пользователь считает, что задача еще не выполнена.

Ответы [ 2 ]

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

Когда вы поворачиваете телефон, ваша деятельность фактически уничтожается и воссоздается.Это включает в себя ваш диалог.Есть два способа исправить это:

1) Отключить эту «полезную» функциональность.Если у вас нет разных макетов для пейзажа и портрета, я бы посоветовал.Добавьте android: configChange = "direction | resize" к вашей активности в манифесте.

2) Реализуйте onSaveInstanceState / onRestoreInstanceState и получите переменную, которая говорит, нужно ли вам заново создавать и перезапускать диалог.

Предложения: попробуйте использовать WorkManager для планирования задачи, а также ViewModel из компонентов архитектуры Android, что поможет сохранить состояние даже после изменений конфигурации

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

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

РЕДАКТИРОВАТЬ:

Добавить android:configChanges="fontScale|density" в файл манифеста.

static int fontScale = 1;
static int densityDpi = 0;

public void onConfigurationChanged(Configuration newConfig) {
  if (newConfig.fontScale != fontScale) {
    // destroy and recreate dialog adjusting for font size.
    fontScale = newConfig.fontScale;
  }
  if (newConfig.densityDpi != densityDpi) {
    // destroy and recreate dialog adjusting for new screen size.
    densityDpi = newConfig.densityDpi;
  }
}

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

...