我使用onStop方法确定应用何时从家庭活动关闭(特别是使用设备上的主页按钮或设备上的任务管理器按钮),它没有设置时间戳以表示用户上次在线(时间戳)在Firebase数据库中。但是,当对所有其他活动调用onStop时,它保持为online = true,这是正确的。
// Home button pressed + task button pressed + leaving activity
@Override
protected void onStop() {
super.onStop();
FirebaseUser currentUser = mFirebaseAuth.getCurrentUser();
if (currentUser != null) {
final String currentDate = DateFormat.getDateTimeInstance().format(new Date());
mUserDatabase.child("Online").setValue(currentDate);
}
}
有什么方法可以指定是否从家庭活动中调用onStop,选项a)是否会将时间戳记放置在数据库中,或者选项b)不会更改数据库的联机状态(因为用户仍在应用程序中,但在另一项活动)。
答案 0 :(得分:0)
您可以创建一个像这样的类:-
public class MalikChat extends Application {
private DatabaseReference mUserDatabase;
private FirebaseAuth mAuth;
@Override
public void onCreate() {
super.onCreate();
Fabric.with(this, new Crashlytics());
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
mAuth = FirebaseAuth.getInstance();
if (!isUserLoggedOut(this)) {
if (mAuth.getCurrentUser() != null) {
mUserDatabase = FirebaseDatabase.getInstance().getReference()
.child(onlineStatusTable).child(mAuth.getCurrentUser().getUid());
mUserDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot != null) {
mUserDatabase.child("status").onDisconnect().setValue(String.valueOf(System.currentTimeMillis()));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
Toast.makeText(this, "Your session is expired, Please login again", Toast.LENGTH_SHORT).show();
startActivity(new Intent(this, LoginActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
setUserLoggedOut(this, true);
}
}
}
}
或您的清单文件中:-
<application
**android:name=".offlineHalper.MalikChat"**
android:allowBackup="false"
android:icon="@drawable/ic_chat_group"
android:label="@string/app_name"
android:roundIcon="@drawable/ic_chat_group"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
如果要设置用户状态,则在所有活动中都设置此方法:-
@Override
protected void onStart() {
userStatus("online");
super.onStart();
}
@Override
protected void onPause() {
userStatus(String.valueOf(System.currentTimeMillis()));
super.onPause();
}
userStatus方法:-
public static void userStatus(String status) {
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference(onlineStatusTable).child(firebaseUser.getUid());
try {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("status", status);
reference.updateChildren(hashMap);
} catch (Exception e) {
e.printStackTrace();
}
}