【问题标题】:Application restart应用程序重启
【发布时间】:2021-10-03 16:12:48
【问题描述】:

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

  • 该应用程序是一个大型商业项目,它与数据库建立了多个连接,并带有登录系统和其他一切
  • 我注意到,例如,如果我将应用程序留在后台大约 10 分钟,它会终止我的连接并重新启动一切,迫使我重新登录。

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

有人知道为什么吗?

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

【问题讨论】:

  • 您是否正在向服务器发送 keep_alive 消息? no_op 请求?如果不是,这可能是问题所在:因为没有传输任何内容,DB 会断开连接,您的应用意识到这一点并重新启动登录序列。
  • 哪个数据库?这种事情经常发生在一个人的MySql身上
  • @g00se 不是。我让应用程序运行了多年,没有(本地)连接被丢弃,全部到 MySQL 和 MariaDB。但是我必须时不时地从守护线程发送这些保持活动的消息。
  • 但我必须时不时地从守护线程发送那些保持活动状态的消息。这就是我的观点;)这正是人们认为他们不必做的事情
  • Android 从不保证让后台应用程序保持运行,系统可能会出于各种原因将它们关闭。有多种技术可以解决这个问题,但如果你想让它永久运行,那么我认为最好使用前台服务。

标签: java android android-activity


【解决方案1】:

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

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

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

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

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

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

我是怎么解决的?

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

android: configChanges = "keyboard | keyboardHidden | navigation"

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

附: 1:不幸的是,并非一切都会顺利进行。如果您的活动有片段,则添加 android: configChanges 将不起作用(我仍在尝试找出解决此问题的方法)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多