【发布时间】: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