【问题标题】:setDefaultNightMode change is not restarting singleTop activitysetDefaultNightMode 更改未重新启动 singleTop 活动
【发布时间】:2018-03-17 22:50:30
【问题描述】:

我有一个设置活动,它有一个选项允许用户使用以下方式在夜间和白天模式之间切换:

AppCompatDelegate.setDefaultNightMode();

这对我几乎所有的活动都非常有效,因为当发生这种情况时,android 会强制更改配置,从而导致所有活动都随着配置更改而重新启动。

但是我有一个活动是 singleTop:

<activity
  android:name=".MyActivity"
  android:launchMode="singleTop" />

此活动没有看到配置更改,也没有重新启动。如果我删除 singleTop 活动会看到配置更改并重新启动。这是android中的错误吗?我已更新到最新的支持库 (27.1.0),但仍然没有运气。

【问题讨论】:

    标签: android android-activity android-theme


    【解决方案1】:

    一般来说,singleTop 启动模式的活动可以被实例化多次,但情况并非总是如此。通常,实例会启动到名为startActivity() 的任务中。但是,如果目标任务在其堆栈顶部已经有一个现有的活动实例,则该实例将接收意图,但不会创建该活动的新实例。因此,活动将不会重新启动,也不会看到配置更改。而且由于AppCompatDelegate.setDefaultNightMode()只对调用后创建的组件生效,所以已经创建的实例不会被更新。

    对于具有启动模式standard(默认模式)的活动,每当这些活动有新的意图时,都会创建一个新实例。这就是为什么当您删除singleTop 模式时可以看到要重新启动的活动和配置更改的原因。

    【讨论】:

    • 'AppCompatDelegate.setDefaultNightMode() 只对调用后创建的组件生效'是为什么选择旋转而不是uiMode?​​span>
    • 是的。因此。由于 android 系统会处理旋转,因此活动 Activity 会拾取它,除非您已锁定 Activity 的方向更改。
    • 正确,但非活动活动也会进行轮换并重新创建。这就是为什么 uiMode 的行为方式不同会非常令人困惑。因此,对于 singleTop 活动,如果 uiMode 已更改,我必须检查 onResume 并自行重新创建活动?
    • 是的,如果我真的需要活动是singleTop,我会这样做
    • 或者你可以像intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) 那样为你的这个活动的意图添加标志
    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2017-03-07
    • 1970-01-01
    相关资源
    最近更新 更多