Firebase: onDisconnect () в службе - PullRequest
0 голосов
/ 21 февраля 2019

Я делаю проект, в котором мне нужно

настроить состояние интернет-соединения в реальном времени

одного клиентского приложения, даже если приложение находится в фоновом режиме.

Мне нужно отобразить его на

Server. Если устройство для конкретной погоды подключено к Интернету или нет,

Я использую 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;
    }
}

Я перепробовал все методы, но ничегосработало.

Помощь будет приветствоваться.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

если вы зарегистрировали свой сервис с помощью menifest.xml и возвращаете start_sticky, он должен работать, но есть и альтернативный способ: вы можете написать API для проверки связи с сервером (вызвать его в сервисе через определенный интервал) исохраните отметку времени с TRUE (если isConnected), так что теперь отметка времени сохраняется вместе с логическим значением true, давайте предположим, что теперь соединение отключено или ячейка не работает, так как обновление не будет отправлено на сервер,право?теперь это волшебство приложения reciver / admin (где вы хотите отобразить этот онлайн-статус графически), теперь напишите другой API, который будет извлекать сохраненный ответ с отметкой времени, а также получить текущее время, когда будет запущен этот API извлечения, найдитеРазница между этими двумя временными метками и наложение условия здесь `(здесь разница в секундах, потому что мы используем временные метки)

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

таким образом, вы можете получить статус онлайн / офлайн в реальном времени в приложении-получателеВы можете установить

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

далее вы можете прочитать этот ответ также Сохранить ответ на сервере, когда сетевое соединение отключено

0 голосов
/ 21 февраля 2019

Вы зарегистрировали свой Сервис в Manifest.xml?И чтобы ваш сервис был «липким», вы должны переопределить ваш onStartCommand, чтобы вернуть START_STICKY

...