加载主活动后,我可以通过更新远程数据库行将记录用户的状态设置为在线状态。如果用户退出应用程序,我必须将用户状态设置为脱机。
如果使用后退按钮退出应用程序我有onDestroy()方法,在那里我可以将用户状态设置为离线,但是如果我使用主页按钮退出并且我从设置onDistroy()中删除应用程序不是调用。
有没有办法知道什么时候主要活动不再在堆栈上,所以我可以更新用户的状态?
答案 0 :(得分:2)
onStop。因此,请在onStop中处理您的活动。
public void onStop () {
//do your stuff here
super.onStop()
}
编辑:
也可以尝试
@Override
protected void onPause()
super.onPause();
}
此外,您还可以检查应用是否正在完成
if (this.isFinishing()){
//Insert your finishing code here
}
答案 1 :(得分:1)
主页按钮不会调用onDestroy
,因为活动仍然在活动堆栈上,与后退按钮一样,它通常被删除。当ActivityManager
决定从堆栈中移除活动时,通常在一段时间不活动或需要资源后,将调用onDestory
,此时您的字段将被重置。
我无法明确表示,因为我不知道所有信息,但是当您按下主页(在onStart
中按照coder_For_Life22的建议)删除登录状态的用户可能会很糟糕,好像你回到了活动,用户必须再次登录,可能不必要,客户端会话管理将变得更加复杂。
除非您有某种服务器端会话管理,否则您的会话管理方法似乎相当可疑,例如,如果会话中存在不活动状态,则会重置数据库字段。
<强>更新强>
我认为可能的唯一方法是使用ActivityManager.getRunningTasks()
或ActivityManager.getRunningAppProcesses()
并检查您的应用是否在其中。如果你像你建议的那样杀了你的应用程序,那么你的应用程序将不会在他们中间,因此你知道。这似乎是一个非常复杂的解决方案,如果可能的话,因为你需要一个单独的后台服务运行(你可以调用getSystemService(ACTIVITY_SERVICE)
来获取ActivityManager
)就这样,你杀了你的应用程序之后仍然有运行的东西可以检查这个并执行适当的操作。
以这种方式杀死您的应用会忽略活动生命周期,因此您的活动中没有可以执行关闭呼叫的挂钩。
检查服务器端的不活动并以这种方式重置字段似乎更为明智,人们不会经常杀死他们的应用程序,当他们这样做时,他们不太可能快速将手机交给其他人谁能够恶意访问这些信息。
如果数据需要这种安全性,那么您应该重新考虑您的安全模型。