我正在将我的应用程序目标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)任务实际上已完成,但用户认为任务仍未完成。
答案 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,即使在配置更改后也可以帮助保留状态