Java Android聊天应用程序检查在线/离线用户firebase
我正在尝试使用.info/connected path在我的android聊天应用程序中添加在线/离线功能 我在onCreate()方法中编写了以下代码 但是当我最小化应用程序超过60秒时,else部分不会执行 它只在我关闭应用程序或关闭互联网超过60秒时才起作用Java Android聊天应用程序检查在线/离线用户firebase,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试使用.info/connected path在我的android聊天应用程序中添加在线/离线功能 我在onCreate()方法中编写了以下代码 但是当我最小化应用程序超过60秒时,else部分不会执行 它只在我关闭应用程序或关闭互联网超过60秒时才起作用 如何使其工作,当应用程序位于前台时,它应将值设置为“在线”,当应用程序位于后台或被杀死时,它应将值设置为“离线”.info/connected反映了应用程序与Firebase实时数据库后端服务器的连接。虽然这可能与用户是否正在积极使用
如何使其工作,当应用程序位于前台时,它应将值设置为“在线”,当应用程序位于后台或被杀死时,它应将值设置为“离线”
.info/connected
反映了应用程序与Firebase实时数据库后端服务器的连接。虽然这可能与用户是否正在积极使用应用程序有关,但它不是1:1映射
如果您想检测应用程序是否是后台的,有更好的方法(与Firebase无关),例如和其他方法。使用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);
}
我用两种方法解决了这个问题 首先,我们需要检测应用程序何时进入后台并返回前台,因此当应用程序进入前台时,将用户状态更新为“在线” 当应用程序转到后台时,将用户状态更新为“脱机” 我们可以通过实现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个sc没有连接时,用户状态将更新为脱机谢谢@Frank van Puffelen,但为什么我的代码中没有执行其他部分。我在firebase文档“firebase在60秒不活动后关闭连接”中读到了这一点。因此,在调用
studentref.child(“status”).setValue(“offline”)时,应在60秒不活动后执行else部分代码>当客户端断开连接时,这意味着它将立即重新连接。有关经过良好测试的状态系统,请参见:Hey@AhmedBasalib。有什么最新消息吗?
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);