首页 > 解决方案 > 应用程序重启

问题描述

我的应用程序遇到了问题,我不知道为什么。以下是:

我能给出的唯一保证是它们与我的服务器没有连接问题,因为在我的测试中它从未失败过。

任何人都可能知道为什么?

(我知道对问题的解释有点模糊,但即使对我来说情况也很模糊)

标签: javaandroidandroid-activity

解决方案


我是如何发现我的问题的?

我的应用程序的用户正在使用蓝牙条形码阅读器,它被编程为在一段时间不活动后自动关闭。我注意到每当蓝牙设备关闭时,如果我的应用程序在后台,它就会失去以前的状态。使用 LogCat 工具,我意识到我的进程被系统本身杀死了。消息总是如下所示:

W/ActivityManager:强制完成活动 my.project/.view.activities.MyActivity

I/ActivityManager: 进程 my.project (pid 12984) 已终止

经过大量研究,我发现Android系统将一些外部事件解释为配置更改,例如屏幕旋转更改,蓝牙设备连接/断开连接等。当发生此类更改时,Android默认情况下会杀死您的应用程序并完全重新启动它再次,以便应用程序适应新的行为。在我的例子中,代码中有一个 NullPointerException,我没有正确处理它,所以应用程序回到开头,丢失了它的状态数据。

但是,在其他应用程序屏幕中,没有发生提到的异常(因此在启动时它不会返回登录),但即便如此,我还是丢失了一些屏幕数据,例如在 EditText 中键入的内容。

我是怎么解决的?

再次研究,我发现您可以让Android自己处理这些配置更改,告诉它不要重新启动它的进程。为此,只需在您的清单中,在所需的活动中添加以下行:

android: configChanges = "keyboard | keyboardHidden | navigation"

就我而言,问题出在蓝牙键盘上,我添加了这些选项键盘 | 键盘隐藏;一些键盘型号,由于某种原因,也改变了 Android 导航,所以我添加了导航。修改后,大功告成!没有更多的问题!

PS 1:不幸的是,并非一切都会成功。如果您的活动有片段,则添加android: configChanges将不起作用(我仍在尝试弄清楚如何解决此问题)。

PS 2:这不是一个好习惯,我需要向您说明这一点。对我来说,这样做是可以的,因为我的应用程序可以很好地响应更改。毕竟,我的应用程序很简单。如果这是您最后的选择,或者像我一样,您的应用程序并不那么复杂,请仅使用我解释过的此功能。记住:这不是解决问题的灵丹妙药;在我的具体情况下,它运行良好,但对您而言,它可能会破坏您的应用程序。

PS 3:我建议在 android 子主题中查看https://developer.android.com/guide/topics/manifest/activity-element#config:configChanges 。列出了设备可以进行的所有配置更改。


推荐阅读