如何显示用户在线?

How to show Online of a user?

我正在尝试让一个应用程序向所有在线用户显示......我正在使用以下方式来实现它

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

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

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

您的猜测完全正确。

启动一个新的 Activity 将导致 onPause()onStop() 方法被第一次调用Activity.

根据您的描述,我假设您希望在线状态在应用程序保留在前台时一直保持为真,并且您将它放在每个 Activity 中,因为您的应用程序不t 仅从单个主 Activity 打开。

如果您切换到使用单一 Activity 架构,您当前的代码将不会出现问题,这只是使用单个 Activity 并让它显示不同的 Fragments 而不是新的 Activity .此解决方案将适用于您现有的代码,因为 onStop()onStart() 只会在您的应用程序进入后台时调用。

如果您查看官方 Android 开发者博客中的 Navigation section,您会看到 Google 想要鼓励开发者转而使用单-Activity架构.

但是,如果您仍然希望使用多个活动,那么您可能需要考虑一种替代方法来跟踪在线状态以考虑多个活动。

例如,您可以使用 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;
}

请记住,这只是一个示例,并未考虑您应用的设计方式。底线是,您必须考虑一个解决方案,该解决方案要考虑显示的多个活动。

我强烈建议使用 Single-Activity 方法。