Android聊天应用检查在线/离线用户firebase



我试图在我的android聊天应用程序中使用。info/连接路径添加在线/离线功能我在onCreate()方法

中编写了以下代码
studentref = FirebaseDatabase.getInstance().getReference("student").child(user.getUid());
connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
studentref.child("status").onDisconnect().setValue("offline");
studentref.child("status").setValue("Online");
} else {
studentref.child("status").setValue("offline");
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});

但是,当最小化应用程序超过60秒时,else部分不会执行只有当我关闭应用程序或当我关闭互联网超过60秒时,它才有效

如何使它工作,当应用程序在前台,它应该设置值"在线"当应用程序处于后台或关闭时,它应该将该值设置为"offline">

我用两种方法解决了这个问题首先,我们需要检测应用程序何时进入后台并回到前台,所以当应用程序进入前台时,将用户状态更新为"在线"当应用进入后台时,将用户状态更新为"Offline">

我们可以通过实现LifecycleObserver类并编写以下2个方法来实现

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onAppBackgrounded() {
//App in background
// here update user state as offline 

}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onAppForegrounded() {
// App in foreground
// here update user state as online

}

但是当没有互联网连接时,这将不起作用,例如:当用户在前台关闭应用程序时关闭互联网,在这种情况下,即使应用程序关闭,用户状态仍将保持在线,为了解决这个问题,我们还需要检查连接到。info/connected path

connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
listenerCon = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
user= FirebaseDatabase.getInstance().getReference("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid());
user.child("state").setValue("Online");
user.child("state").onDisconnect().setValue(ServerValue.TIMESTAMP);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
};
connectedRef.addValueEventListener(listenerCon);

所以当超过60秒没有连接时,用户状态将更新为离线

.info/connected反映了您的应用程序到Firebase实时数据库的后端服务器的连接。虽然这可能与用户是否积极使用应用程序有关,但这不是1:1的映射。

如果你想检测应用程序是否在后台,有更好的方法(与Firebase无关),例如如何检测Android应用程序何时进入后台并返回前台和其他搜索结果

使用我的代码,在onCreate

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String id = user.getUid();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Users").child(id).child("stateOnline");

if (user != null){
reference.setValue(true);
reference.onDisconnect().setValue(false);
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
boolean connected = snapshot.getValue(Boolean.class);
if (connected) {
// CONNECTED
} else {
// NOT CONNECTED
}
}
@Override
public void onCancelled(DatabaseError error) {
System.err.println("Listener was cancelled");
}
});
reference.keepSynced(true);
}