【问题标题】:Handle runtime screen resolution changes处理运行时屏幕分辨率更改
【发布时间】:2017-01-26 22:44:35
【问题描述】:

在一些新的 Android 7.0 固件中,可以选择更改屏幕分辨率(例如,S7 Edge 的 Android 7.0 固件可以选择在运行时从 qhd / fhd / hd 切换显示分辨率)。

我的调试尝试表明没有配置更改即将到来(因为我的应用正确处理语言更改,但没有处理分辨率更改)。

如何正确处理这种配置变化?

【问题讨论】:

  • “没有配置更改即将到来”是什么意思?另外,你的targetSdkVersion是什么?
  • @CommonsWare targetSdkVersion = 23。意味着似乎没有 onConfigChange() 回调。
  • 见伊恩的回答。由于您的targetSdkVersion 为 23,因此当用户更改缩放级别时应终止您的进程,并且当用户返回您的应用程序时将重新创建您的活动(以及新进程)。
  • @CommonsWare 知道如何检测和处理应用小部件的屏幕分辨率变化吗?
  • @drmrbrewer:这是一个很好的问题——我还没有尝试过这种特定的组合。理想情况下,onAppWidgetOptionsChanged() 会在某个时候被调用,就像应用小部件调整大小操作一样,但我不知道是不是这样。

标签: android android-7.0-nougat


【解决方案1】:

根据Screen Zoom documentation

  • 如果应用以 API 级别 23 或更低级别为目标,系统会自动终止其所有后台进程。这意味着如果用户离开此类应用程序以打开设置屏幕并更改显示大小设置,系统会以与内存不足情况相同的方式终止该应用程序。如果应用程序有任何前台进程,系统会按照Handling Runtime Changes 中的描述通知这些进程配置更改,就像设备的方向已更改一样。

  • 如果应用面向 Android 7.0,则其所有进程(前台和后台)都会收到有关配置更改的通知,如 Handling Runtime Changes 中所述。

类似于handling configuration changes for multi-window,您应该确保处理以下configChanges

android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

【讨论】:

  • 处理配置更改似乎是围绕活动。我有一个主屏幕widget,如果屏幕分辨率发生变化,它需要重新绘制。我有一些用户报告说小部件在改变分辨率时消失了,我怀疑我可以通过重新绘制小部件来解决这个问题......但是小部件是如何通知的?
  • @drmrbrewer - 当它们的大小发生变化时,小部件会向onAppWidgetOptionsChanged 发送回调。
【解决方案2】:

我发现需要在configChanges 中为 Android 7 中的活动设置一个未记录的标志 density 才能在屏幕缩放中存活。

android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|fontScale|density"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多