当主活动被加载时,我可以通过更新远程数据库行将记录用户的状态设置为联机。如果用户退出应用程序,我必须将用户状态设置为脱机状态。
如果使用后退按钮退出应用程序,我有OnDebug()方法,在那里我可以将用户状态设置为脱机状态,但是如果我使用home按钮退出,并且从设置OnDistBooY()中杀死应用程序,则不被调用。
有没有办法知道主活动何时不再在堆栈上,以便我可以更新用户的状态?
最佳答案
home按钮不调用onDestroy
,因为活动仍在活动堆栈中,与back按钮一样,它通常被删除。当ActivityManager
决定从堆栈中移除活动时,通常在一段时间不活动或需要资源时,将调用onDestory
,此时将重置字段。
我无法明确地说,因为我不知道所有信息,但似乎在您按Home键时删除已登录用户的状态(按照coder_for庀life2的建议,在onStart
中)可能是不好的,好像您返回到活动时,用户必须重新登录,也许不必要的话,客户端会话管理将变得更加复杂。
您的会话管理方法似乎是相当可疑的,无论如何,除非您有某种服务器端会话管理,例如,如果会话上有不活动,数据库字段将被重置。
更新
我唯一能想到的可能是使用ActivityManager.getRunningTasks()
或ActivityManager.getRunningAppProcesses()
并检查你的应用程序是否在其中。如果你像你所建议的那样杀死你的应用程序,那么你的应用程序将不在其中,因此你知道。如果可能的话,这看起来是一个非常复杂的解决方案,因为你需要运行一个单独的后台服务(你可以调用getSystemService(ACTIVITY_SERVICE)
来获取ActivityManager
),这样在你关闭你的应用程序之后,你仍然有一些东西在运行,可以对此进行检查并执行适当的操作。
以这种方式终止应用程序会忽略活动生命周期,因此活动中没有可以执行关闭调用的挂钩。
检查服务器端的不活动状态并用这种方式重置字段似乎更为明智,人们通常不会像这样杀死他们的应用程序,当他们这样做时,他们不太可能将手机迅速交给能够恶意访问信息的其他人。
如果数据需要这样的安全性,那么您应该重新考虑您的安全模型。