应用重启
Application restart
我的应用程序 运行 遇到了问题,我不知道为什么。以下为:
- 该应用程序是一个大型商业项目,它与数据库建立了多个连接,具有登录系统和其他一切
- 我注意到,如果我将应用程序留在后台大约 10 分钟,例如,它会终止我的连接并重新启动所有内容,迫使我再次登录。
我唯一能保证的是它们不是我服务器的连接问题,因为在我的测试中它从未失败过。
有人知道为什么吗?
(我知道问题的解释有点含糊,但情况对我来说也很含糊)
我是怎么发现我的问题的?
我的应用程序的用户使用的是蓝牙条形码 reader,它被编程为在 activity 一段时间后自动关闭。我注意到,每当蓝牙设备关闭时,如果我的应用程序处于后台,它就会失去之前的状态。使用 LogCat 工具,我意识到我的进程被系统本身杀死了。消息始终如下所示:
W/ActivityManager: Force finishing activity
my.project/.view.activities.MyActivity
I/ActivityManager: Process my.project (pid 12984) has died
经过大量研究,我发现 Android 系统会将一些外部事件解释为配置更改,例如屏幕旋转更改、蓝牙设备 connection/disconnection 等。
发生此类更改时,Android 默认情况下会终止您的应用程序进程并再次完全重新启动它,以便应用程序适应新行为。在我的例子中,代码中有一个 NullPointerException,我没有正确处理它,所以应用程序回到了开始,丢失了它的状态数据。
然而,在其他应用程序屏幕中并没有发生上述异常(因此它不会在启动时返回登录),但即便如此我还是丢失了一些屏幕数据,比如在 EditText 中输入的内容,例如。
我是怎么解决的?
再次研究,我发现你可以让 Android 自己处理这些配置更改,告诉它不要重新启动它的进程。为此,只需在您的清单中添加所需的 activity 行:
android: configChanges = "keyboard | keyboardHidden | navigation"
在我的情况下,问题出在蓝牙键盘上,我添加了这些选项 keyboard |键盘隐藏;一些键盘模型,出于某种原因,也改变了 Android 导航,所以我添加了 导航 。完成此更改后,完成!没有问题了!
P.S。 1:不幸的是,并非所有事情都会成功。添加 android: configChanges 如果您的 activity 有片段,则将不起作用(我仍在尝试找出解决方法)。
P.S。 2:这不是一个好的做法,我需要向你说明这一点。对我来说,这样做没问题,因为我的应用程序可以很好地响应更改。毕竟,我的应用程序很简单。如果这是您最后的选择,或者像我一样,您的应用程序不是那么复杂,请仅使用我解释过的这个功能。记住:这不是解决问题的灵丹妙药;在我的具体情况下它工作正常,但对你来说,它可能会破坏你的应用程序。
P.S。 3:我建议在 android 子主题中查看 https://developer.android.com/guide/topics/manifest/activity-element#config:configChanges。列出了设备可以进行的所有配置更改。
我的应用程序 运行 遇到了问题,我不知道为什么。以下为:
- 该应用程序是一个大型商业项目,它与数据库建立了多个连接,具有登录系统和其他一切
- 我注意到,如果我将应用程序留在后台大约 10 分钟,例如,它会终止我的连接并重新启动所有内容,迫使我再次登录。
我唯一能保证的是它们不是我服务器的连接问题,因为在我的测试中它从未失败过。
有人知道为什么吗?
(我知道问题的解释有点含糊,但情况对我来说也很含糊)
我是怎么发现我的问题的?
我的应用程序的用户使用的是蓝牙条形码 reader,它被编程为在 activity 一段时间后自动关闭。我注意到,每当蓝牙设备关闭时,如果我的应用程序处于后台,它就会失去之前的状态。使用 LogCat 工具,我意识到我的进程被系统本身杀死了。消息始终如下所示:
W/ActivityManager: Force finishing activity my.project/.view.activities.MyActivity
I/ActivityManager: Process my.project (pid 12984) has died
经过大量研究,我发现 Android 系统会将一些外部事件解释为配置更改,例如屏幕旋转更改、蓝牙设备 connection/disconnection 等。 发生此类更改时,Android 默认情况下会终止您的应用程序进程并再次完全重新启动它,以便应用程序适应新行为。在我的例子中,代码中有一个 NullPointerException,我没有正确处理它,所以应用程序回到了开始,丢失了它的状态数据。
然而,在其他应用程序屏幕中并没有发生上述异常(因此它不会在启动时返回登录),但即便如此我还是丢失了一些屏幕数据,比如在 EditText 中输入的内容,例如。
我是怎么解决的?
再次研究,我发现你可以让 Android 自己处理这些配置更改,告诉它不要重新启动它的进程。为此,只需在您的清单中添加所需的 activity 行:
android: configChanges = "keyboard | keyboardHidden | navigation"
在我的情况下,问题出在蓝牙键盘上,我添加了这些选项 keyboard |键盘隐藏;一些键盘模型,出于某种原因,也改变了 Android 导航,所以我添加了 导航 。完成此更改后,完成!没有问题了!
P.S。 1:不幸的是,并非所有事情都会成功。添加 android: configChanges 如果您的 activity 有片段,则将不起作用(我仍在尝试找出解决方法)。
P.S。 2:这不是一个好的做法,我需要向你说明这一点。对我来说,这样做没问题,因为我的应用程序可以很好地响应更改。毕竟,我的应用程序很简单。如果这是您最后的选择,或者像我一样,您的应用程序不是那么复杂,请仅使用我解释过的这个功能。记住:这不是解决问题的灵丹妙药;在我的具体情况下它工作正常,但对你来说,它可能会破坏你的应用程序。
P.S。 3:我建议在 android 子主题中查看 https://developer.android.com/guide/topics/manifest/activity-element#config:configChanges。列出了设备可以进行的所有配置更改。