Android 15/16: возврат из браузера (глубокая ссылка) вызывает смешанную тему DayNight во фрагментах (новые фрагменты испAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android 15/16: возврат из браузера (глубокая ссылка) вызывает смешанную тему DayNight во фрагментах (новые фрагменты исп

Сообщение Anonymous »

У меня есть приложение для Android, использующее AppCompat DayNight (

Код: Выделить всё

Theme.MaterialComponents.DayNight.NoActionBar
).
Цель
  • При первом запуске: приложение должно соответствовать теме ОС (необязательно).
  • После того, как пользователь вручную выбирает Светлый или Темный, приложение должно всегда использовать эту сохраненную тему, в том числе при возврате из внешних приложений (браузера) через deeplink.
Текущая реализация
При запуске активности я применяю тему перед super.onCreate():

Код: Выделить всё

override fun onCreate(savedInstanceState: Bundle?) {
initTheme()
super.onCreate(savedInstanceState)
setContentView(...)
}

private fun initTheme() {
when (Configs.getCurrentTheme(this)) {
"light" -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
"dark"  -> AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
Настройки темы хранятся в SharedPreferences:

Код: Выделить всё

object Configs {
private const val selectedTheme = "selectedTheme"

fun saveSelectedTheme(context: Context, value: String) {
PreferencesManager.getInstance(context).save(selectedTheme, value)
}

fun getCurrentTheme(context: Context) =
PreferencesManager.getInstance(context).read(selectedTheme).let {
it.ifEmpty {
when (context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK) {
Configuration.UI_MODE_NIGHT_YES -> "dark"
else -> "light"
}
}
}
}
Когда пользователь меняет тему вручную, я перезапускаю Activity (этот подход никогда не дает сбоя):

Код: Выделить всё

Configs.saveSelectedTheme(
this,
if (Configs.getCurrentTheme(this) == "light") "dark" else "light"
)
finish()
startActivity(Intent(this, MainActivity::class.java))
Проблема (только Android 15/16)
На Android 14 и более ранних версиях все в порядке.
На Android 15 и 16 (проверено на Samsung / Honor / NothingPhone):
  • Тема ОС Темная
  • Сохраненная в приложении тема Светлая (

    Код: Выделить всё

    MODE_NIGHT_NO
    )
  • В приложении я открываю браузер (

    Код: Выделить всё

    ACTION_VIEW
    URL)
  • Я возвращаюсь в приложение через deeplink
После возврата:
  • Существующие/старые фрагменты (созданные до браузера) по-прежнему отображаются Светлым
  • Все новые фрагменты, созданные после возврата, становятся темными (системная тема)
  • Результатом является пользовательский интерфейс со смешанной темой во всех фрагментах.
Похоже, что при выходе из браузера активность/ресурсы временно действуют так, как будто применяется системный режим пользовательского интерфейса (темный), хотя ночной режим приложения фиксирован на освещении.
Ограничения/дополнительные детали
  • У меня нет android:configChanges для uiMode и т. д.
  • Родительская тема — Theme.MaterialComponents.DayNight.NoActionBar
Поэтому мне нужно решение, которое:
  • Предотвращает смешанные темы на Android 15/16 при возврате из браузера или глубокой ссылки
  • Предпочтительно не полагается на recreate()
Что я Пробовал
  • Вызов AppCompatDelegate.setDefaultNightMode(...) ранее (до super.onCreate)
  • Повторное применение дня/ночи в onResume() / onNewIntent() через Deleate.applyDayNight()
  • Использование Deleate.localNightMode
  • Перезапуск активности при несоответствии (иногда работает, но не всегда; также попытка воссоздания вызывает сбои в моем стеке навигации)
Вопрос
Каков правильный и надежный способ (особенно на Android 15/16), чтобы приложение оставалось в сохраненном режиме «День/ночь» после возврата из внешнего приложения (браузера) через deeplink, не получая при этом смешанные тематические фрагменты?
Если известно изменение поведения Android 15/16 или рекомендуемый обходной путь (например, использование обработки uiMode, переноса контекста, конфигурации манифеста или специальной Использование AppCompat API), поделитесь.

Подробнее здесь: https://stackoverflow.com/questions/798 ... t-theme-in
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»