【问题标题】:Handling Display Size change处理显示尺寸变化
【发布时间】:2019-05-20 21:23:18
【问题描述】:

我正在将我的应用目标 SDK 版本迁移到 android oreo。

可能会影响应用的更改之一是,如果设备的显示尺寸发生更改,那么针对 Android Nougat 及更高版本的应用将收到通知,就好像设备的方向发生了更改一样。以下是出处。

当设备密度发生变化时,系统会通知正在运行的应用 有以下几种方式:

如果应用以 API 级别 23 或更低级别为目标,系统会自动 杀死其所有后台进程。这意味着如果用户切换 远离此类应用程序以打开“设置”屏幕并更改 显示大小设置,系统杀掉app的方式相同 它会在内存不足的情况下。如果应用程序有任何前景 进程,系统将配置通知那些进程 按照处理运行时更改中的描述进行更改,就像 设备的方向已更改。 如果应用面向 Android 7.0,则所有 通知其进程(前台和后台) 配置更改,如处理运行时更改中所述。

现在我的应用程序有一个长时间运行的进程,它在 Android Activity 的异步 TSak 中运行。这意味着应用程序有一个 AsyncTask,它位于 Activity 代码中。

我在异步任务开始时创建一个对话框,并在异步任务完成工作后将其隐藏。

现在假设用户启动任务然后转到设置并更改显示大小然后返回到我的应用程序然后应用程序的对话框消失了异步任务仍然执行到最后这意味着用户可能认为应用程序已完成任务,但应用程序实际上正在执行任务。但是除了异步任务正在运行之外,我的 Activity 也像重新启动一样响应。

我的应用的方向锁定为纵向。

我应该如何处理这种情况?任何帮助表示赞赏。谢谢!

编辑:这是场景

1) 应用启动

2) 主屏幕

3) 用户按下按钮

4) 主屏幕内的 AsyncTask 已启动

5) 显示任务进度对话框

6) 用户最小化应用程序并进行设置

7) 更改显示大小/密度或更改设备的字体大小

8) 我的应用程序被操作系统调用,就像设备旋转改变了一样

9) 然后用户返回应用程序

10) 但是显示的对话框不再显示

11) 但是异步任务在后台运行并且仍在执行它的任务

12) 任务实际上已经完成,但用户认为任务还没有完成。

【问题讨论】:

  • 你的问题有点不清楚。你能用小 gif 编辑问题吗? 以便我们有更好的想法。
  • @RumitPatel 感谢您的回复。抱歉,我无法附上应用程序的 gif,但我已经逐步编写了场景。你能看看吗。
  • 您的问题将重点放在显示尺寸更改上,但似乎您只是没有正确处理配置更改(如果您支持屏幕旋转,您应该从一开始就完成此操作)。您应该改进您的代码,以便 1) 对话框在旋转时再次启动(这应该发生在 DialogFragment 上)和 2) 让 AsyncTask 找到新对话框(例如,您可以使用 setRetainInstance 将其托管在片段中)。如果你想做得更好,你可以在 ViewModel 中设置 AsyncTask 并将结果发布给观察者。
  • @gicci 是的,你是对的。您能否提供一个示例代码,以便我更好地处理这个问题?
  • 你的问题不清楚你想在后台执行任务或者用户回来后通知消失是你的问题吗??

标签: java android android-asynctask android-8.0-oreo android-7.0-nougat


【解决方案1】:

在你的 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;
  }
}

对异步任务使用通知可能会更好,因为它们不受配置更改的影响,并且不会在内存不足的情况下终止。

【讨论】:

  • 设备密度变化如何?能否提供示例代码?
  • 设备密度变化与屏幕尺寸变化相同。屏幕宽度和高度会发生变化。至于提供代码,我将给出一个通用示例,它很可能不适用于您的代码,因为您没有提供任何代码。
  • 感谢您的回答。所需的完美答案。还有一个疑问,如果不使用onConfigurationChanged,那么该应用程序也与以前一样(这种情况对我来说更好)。这是正确的行为吗?在许多设备上都是如此吗?无论如何,再次感谢您的回答。
  • 这是唯一适用于多个设备和配置更改的解决方案。很抱歉,如果这不是最佳的,但这是可以做到的最好的。
  • 谢谢。你的解决方案是最好的。再次感谢
【解决方案2】:

当您旋转手机时,您的活动实际上会被销毁并重新创建。这包括您的对话。有两种方法可以解决它:

1) 关闭这个“有用的”功能。如果您没有横向和纵向的不同布局,我建议您这样做。将 android:configChange="orientation|resize" 添加到清单中的活动中。

2) 实现 onSaveInstanceState/onRestoreInstanceState 并有一个变量表明您是否需要重新创建和重新启动对话框。

建议: 尝试使用 WorkManager 来安排任务以及来自 android 架构组件的 ViewModel,即使在配置更改后也有助于保持状态

【讨论】:

  • 感谢您的回答,但是对于方向更改,我从来没有遇到过问题,但主要问题是密度或字体更改。
猜你喜欢
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多