如何显示用户在线?
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 方法。
我正在尝试让一个应用程序向所有在线用户显示......我正在使用以下方式来实现它
@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 方法。