Firebase:服务中的 onDisconnect()

Firebase: onDisconnect() in a service

我正在做一个项目,我必须

configure realtime internet connection status

一个客户端应用程序,即使应用程序在后台。

我必须在

上显示它

ServerSide that weather specific device is connected to internet or not

我正在使用 Firebase 执行此场景,但它不起作用。

ConnectionService

public class ConnectionService extends Service implements ConnectivityReciever.ConnectivityRecieverListner {

    public static final int notify = 5000;
    private Handler mHandler=new Handler();
    private Timer mTimer = null;
    FirebaseDatabase db;
    DatabaseReference dbRef;


    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        dbRef=FirebaseDatabase.getInstance().getReference(Common.DEVICE_NAME).child("online");
        MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
        boolean isConnected=ConnectivityReciever.isConnected();
        checkConnection(isConnected);

        if(mTimer!=null){
            mTimer.cancel();
        }else{
            mTimer=new Timer();
            mTimer.scheduleAtFixedRate(new TimeDisplay(),0,notify);
        }
    }

    private void checkConnection(boolean isConnected) {

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Toast.makeText(ConnectionService.this, "Service is destroyed", Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        if(isConnected){
            dbRef.onDisconnect().setValue("true");
            Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();

        }
        if(!isConnected){

            dbRef.onDisconnect().setValue(ServerValue.TIMESTAMP);

            Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();

        }
    }

    //class TimeDisplay for handling task
    class TimeDisplay extends TimerTask {
        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    MyApplication.getInstance().setConnectivtyListner(ConnectionService.this);
                    boolean isConnected=ConnectivityReciever.isConnected();
                    checkConnection(isConnected);
                    // display toast
                    Toast.makeText(ConnectionService.this, "Service is running", Toast.LENGTH_SHORT).show();
                }
            });

        }

        private void checkConnection(boolean isConnected) {
            if(isConnected){
                dbRef.setValue("true");
                Toast.makeText(ConnectionService.this, "online", Toast.LENGTH_SHORT).show();
            }
            if(!isConnected){

                dbRef.child("online").onDisconnect().setValue(ServerValue.TIMESTAMP);
                Toast.makeText(ConnectionService.this, "offline", Toast.LENGTH_SHORT).show();
            }
        }

    }


}

申请

public class MyApplication extends Application {
    public static MyApplication mInstance;

    DatabaseReference dbRef;
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance=this;
        Common.DEVICE_NAME = android.os.Build.MODEL;
        FirebaseApp.initializeApp(this);

        FirebaseDatabase.getInstance().setPersistenceEnabled(true);



    }

    public static synchronized MyApplication getInstance(){
        return mInstance;
    }

    public void setConnectivtyListner(ConnectivityReciever.ConnectivityRecieverListner listner){
        ConnectivityReciever.connectivityReceiverListener = listner;
    }
}

我已经尝试了所有的方法,但没有任何效果。

帮助将被取消。

谢谢

您是否在 Manifest.xml 中注册了您的服务? 为了使您的服务成为 "sticky",您应该将 onStartCommand 覆盖为 return START_STICKY

如果您已使用 menifest.xml 注册了您的服务并且返回 start_sticky,它应该可以工作,但还有另一种方法,您可以编写一个 api 来 ping 服务器(在特定时间间隔后在服务中调用它),并使用 TRUE 保存 时间戳(如果已连接),所以现在时间戳与布尔值 true 一起保存,让我们现在假设连接关闭或单元已死,因为不会将更新发送到服务器,对吗? 现在 reciver/admin 应用程序的魔力来了(你想在其中以图形方式显示此在线状态),现在编写另一个 API 它将获取带有时间戳的已保存响应,并在获取 API会被触发,求差b/w这两个时间戳&这里加上条件` (这里的区别是以秒为单位,因为我们使用的是时间戳)

if(timeDifference>60)`
{
echo "true";
}
else 
echo "false";

通过这种方式你可以获得实时online/offline状态 在接收者应用程序上,您可以设置

if(response.equals("true"))
{
textView.setText("ONLINE")
}
else
{
textView.setText("OFFLINE")
}

您还可以阅读此 post 答案