我正在尝试让一个应用程序在线显示所有用户...我使用以下方式来实现它
@Override
public void onStart(){
super.onStart();
mDatabaseReference.child("Online").setValue(true);
}
@Override
public void onStop(){
super.onStop();
mDatabaseReference.child("Online").setValue(false);
}
我没有使用 on断开连接,因为它仅在应用程序完全关闭(不在后台运行(时才显示离线。所以我在每个活动中都使用了这种方法......但问题是,每当我打开一个活动时,它都会在线显示,下一秒就会离线......我猜这是因为上一个活动在打开新活动后关闭,因此在下一个活动停止之前执行当前活动的启动。因此,由于活动的 onstop 是最后执行的,因此它显示为离线。我该如何解决这个问题
你的猜测是完全正确的。
启动一个新活动将导致为第一个活动调用onPause(( 和onStop((方法。
根据您的描述,我假设您希望只要应用程序保持在前台并且您将其放在每个活动中,"联机"状态就保持为真,因为您的应用程序不仅从单个主活动打开。
如果您切换到使用单活动架构,则您当前的代码将毫无问题地工作,该架构只是使用单个活动并让它显示不同的片段而不是新活动。此解决方案将适用于现有代码,因为onStop(( 和onStart((仅在应用进入后台时调用。
如果您查看官方Android开发人员博客中的导航部分,您会发现Google希望鼓励开发人员改用单活动架构。
但是,如果您仍希望使用多个活动,则可能需要考虑另一种方法来跟踪在线状态,以考虑多个活动。
例如,您可以使用 int 值,而不是使用简单的布尔值。
@Override
public void onStart(){
super.onStart();
mDatabaseReference.child("Online").addValue();
}
@Override
public void onStop(){
super.onStop();
mDatabaseReference.child("Online").removeValue();
}
addValue(( 和 removeValue(( 是:
private void addValue(){
activityCount++;
onlineStatus = true;
}
private void removeValue(){
activityCount--;
if(activityCount <= 0)
onlineStatus = false;
}
请记住,这只是一个示例,并未考虑应用的设计方式。最重要的是,您必须考虑一个考虑到显示的多个活动的解决方案。
我强烈建议使用单活动方法。