如何显示用户在线?

时间:2018-07-08 17:25:09

标签: java android android-activity onstart

我正在尝试开发一个可以在线显示所有用户的应用程序...我正在通过以下方式实现它

    @Override
public void onStart(){
    super.onStart();
    mDatabaseReference.child("Online").setValue(true);
}

@Override
public void onStop(){
    super.onStop();
    mDatabaseReference.child("Online").setValue(false);
}

我不使用ondisconnect,因为只有在应用程序完全关闭(不在后台运行)时,它才会脱机显示。所以我在每个活动上都使用了这种方法...但是问题是,每当我打开一个活动时,它都会在线显示,而下一秒将变为离线...我猜是因为上一个活动在打开新活动后关闭,所以当前活动的开始将在下一个活动的停止之前执行。因此,由于活动的onstop最后执行,因此显示为脱机。我该如何解决这个问题

1 个答案:

答案 0 :(得分:0)

您的猜测是完全正确的。

启动新的活动将导致为第一个活动调用 onPause() onStop()方法。

根据您的描述,我假设您希望在线状态在应用程序保持在前台状态之前一直保持为真,并且将其放置在每个活动中,因为您的应用程序不仅会从单个应用程序中打开主要活动。

如果您切换到使用单一活动架构,那么您当前的代码将没有问题,该架构只是使用单个活动,并使其显示不同的片段而不是新的活动。此解决方案将与您现有的代码一起使用,因为 onStop() onStart()仅在您的应用进入后台时才会调用。

如果您在官方的Android开发者博客中查看Navigation section,您会发现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;
}

请记住,这仅是示例,并未考虑应用程序的设计方式。最重要的是,您必须考虑一个解决方案,该解决方案考虑到显示的多个活动。

我强烈建议采用“单一活动”方法。