处理显示尺寸更改

时间:2018-12-20 10:53:33

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

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

可能会影响应用程序的一项更改是,如果更改了设备的显示尺寸,则将通知目标为Android Nougat及更高版本的应用程序,就像设备的方向发生了变化一样。以下是来源。

  

当设备密度改变时,系统会通知正在运行的应用程序   可以通过以下方式:

     

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

现在,我的应用程序运行时间较长,可在Android Activity中的Async TSak中运行。这意味着该应用程序的活动代码中包含一个AsyncTask。

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

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

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

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

编辑:这是场景

1)应用启动

2)主屏幕

3)用户按下A按钮

4)主屏幕内的AsyncTask已启动

5)显示一个对话框,显示任务的进度

6)用户将应用程序最小化并转到设置

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

8)操作系统以某种方式调用我的App,就像改变设备的旋转方式

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

旋转手机时,实际上会破坏并重新创建您的活动。这包括您的对话框。有两种解决方法:

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

2)实现onSaveInstanceState / onRestoreInstanceState并具有一个变量,该变量指示您是否需要重新创建并重新启动对话框。

建议: 尝试使用WorkManager安排任务以及android体系结构组件中的ViewModel,即使在配置更改后也可以帮助保留状态