处理显示尺寸更改

Rah*_*602 9 java android android-asynctask android-7.0-nougat android-8.0-oreo

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

可能影响应用的更改之一是,如果更改了设备的显示尺寸,则会通知针对Android Nougat及更高版本的应用,就好像设备的方向发生了变化一样.以下是来源.

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

如果应用程序的目标是API级别23或更低,系统会自动终止其所有后台进程.这意味着如果用户从这样的应用程序切换到打开"设置"屏幕并更改"显示大小"设置,系统将以与在低内存情况下相同的方式杀死应用程序.如果应用程序具有任何前台进程,系统会按照处理运行时更改中的描述通知这些进程配置更改,就像设备的方向已更改一样.如果应用程序针对Android 7.0,则会按照处理运行时更改中的说明通知其所有进程(前台和后台)配置更改.

现在我的应用程序有一个长时间运行的进程,它在Android Activity中的Async TSak中运行.这意味着应用程序在活动代码中有一个AsyncTask.

我在异步任务的开头创建一个对话框,并在异步任务完成其工作时隐藏它.

现在假设用户启动任务然后转到设置并更改显示大小然后返回到我的应用程序然后应用程序的对话框消失,异步任务仍然执行直到结束,这意味着用户可能会想到应用程序已完成任务,但应用程序将实际执行任务.但我的Activity也响应,好像重新启动,除了Async Task正在运行.

我的应用程序的方向锁定为纵向.

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

编辑:这是场景

1)App Start

2)主屏幕

3)用户按A按钮

4)主屏幕内的AsyncTask启动

5)显示一个对话框,其中包含任务进度

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

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

8)操作系统调用我的应用程序,就像设备轮换被更改一样

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

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

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

12)任务实际上已完成,但用户认为任务仍未完成.

小智 5

在 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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