簡體   English   中英

Android 聊天應用檢查在線/離線用戶 firebase

[英]Android chat app Checking online/offline users firebase

我正在嘗試使用.info/connected path 在我的 android 聊天應用程序中添加在線/離線功能我在 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 秒時才有效

如何使它工作,當應用程序在前台時,它應該設置值“在線”,當應用程序在后台或被殺死時,它應該設置值“離線”

我使用兩種方法解決了這個問題首先我們需要檢測應用程序何時進入后台並返回前台,因此當應用程序進入前台時將用戶 state 更新為“在線”當應用程序進入后台時更新用戶state 為“離線”

我們可以通過實現 LifecycleObserver class 並編寫以下 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
          
    }

但這在沒有互聯網連接時不起作用,例如:當用戶關閉互聯網而應用程序在前台並關閉應用程序在這種情況下,用戶 state 將保持在線,即使應用程序關閉,為了解決這個問題,我們需要還要檢查與.info/connected 路徑的連接

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 沒有連接時,用戶 state 將更新為離線

.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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM