Клиент Socket.io на android отключается через 5 минут

Я реализовал клиент Socket.io на Android, мне удалось инициализировать сокет в неограниченном сервисе, но проблема в том, что он отключился через 5 минут, когда приложение работает в фоновом режиме и телефон заблокирован. Если приложение находится на переднем плане, соединение остается живым бесконечно.

Ситуация по отключению:

  1. Сервис все еще работает
  2. Разъем отключен по неизвестной причине
  3. Экземпляр сокета создается в классе Singelton, и экземпляр всегда остается неизменным в жизненном цикле, я проверил хэш-код для экземпляра сокета.
  4. Я также реализовал решение для пинг-понга, но оно не работает.
  5. Проверил логи сервера и обнаружил, что сокет отключен для пользователя.
  6. Я даже пытался перезапустить службу, но после перезапуска не установил соединение.
  7. Единственный способ подключить сокет снова, чтобы убить приложение и перезапустить приложение.

MySingelton.java

public class Singelton implements Serializable {
    private static Singelton instance;
    private static final String SERVER_ADDRESS = "xyz";
    private Socket mSocket;
    private Context context;

    public Singelton(Context context) {
        this.context = context;
        this.mSocket = getServerSocket();
    }

    public static Singelton get(Context context){
        if(instance == null){
            instance = getSync(context);
        }
        instance.context = context;
        return instance;
    }

    private static synchronized Singelton getSync(Context context) {
        if(instance == null){
            instance = new Singelton(context);
        }
        return instance;
    }

    public Socket getSocket(){
        return this.mSocket;
    }

    public Socket getServerSocket() {
        try {
            IO.Options opts = new IO.Options();
            opts.forceNew = true;
            opts.reconnection = true;
            mSocket = IO.socket(SERVER_ADDRESS, opts);
            return mSocket;
        } catch (URISyntaxException e) {
            throw new RuntimeException(e);
        }
    }
}

MyService

public class MessageService extends Service {
    Socket mSocket;
    
    public MessageService() {
        mSocket = Singelton.get(this).getSocket();
        Log.d("chat", "Constructor"+String.valueOf(mSocket.hashCode()));
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d("chat", "onStartCommand"+String.valueOf(mSocket.hashCode()));
        initSocket();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
        wl.acquire();
        //Log.e(TAG, "onStartCommand");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.d("chat", "onDestroyed");
        Calendar cal = Calendar.getInstance();
        Intent intent = new Intent(getApplicationContext(), MessageService.class);
        PendingIntent pintent = PendingIntent.getService(MessageService.this, 0, intent, 0);
        AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+(1*1000), pintent);

        super.onDestroy();
    }

    @Override
    public void onCreate() {
        Log.d("chat", "onCreate");
        super.onCreate();
    }

    private void initSocket(){
        mSocket.on(Socket.EVENT_CONNECT,onConnect);
        mSocket.on(Socket.EVENT_DISCONNECT,onDisconnect);
        mSocket.on(Socket.EVENT_CONNECT_ERROR, onConnectError);
        mSocket.on(Socket.EVENT_CONNECT_TIMEOUT, onConnectError);
        mSocket.on(Socket.EVENT_RECONNECT, onReconnect);
        mSocket.on("pingy", ping);      
        mSocket.connect();
        mSocket.emit("pongy", "Hi");
    }
    int i=0;
    Emitter.Listener ping = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d("chat", String.valueOf(i) + " " + mSocket.hashCode());
            i++;
            Handler handler = new Handler(Looper.getMainLooper());
            handler.post(new Runnable() {
                @Override
                public void run() {
                    new CountDownTimer(2000,1000) {
                        @Override
                        public void onTick(long millisUntilFinished) {

                        }

                        @Override
                        public void onFinish() {
                            mSocket.emit("pongy", "Hi");                           
                        }
                    }.start();
                }
            });
        }
    };

    Emitter.Listener onConnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d("chat", "connected");
        }
    };
    Emitter.Listener onReconnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d("chat", "onReconnect");
        }
    };
    Emitter.Listener onDisconnect = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            //mSocket.disconnect();
            Log.d("chat", "onDisconnect");
            stopSelf();
        }
    };
    Emitter.Listener onConnectError = new Emitter.Listener() {
        @Override
        public void call(Object... args) {
            Log.d("chat", args[0].toString());
        }
    };
    
    
    
    
    
    

    

    

 
}

Примечание: я хочу, чтобы служба работала в фоновом режиме все время, и она не должна быть уничтожена системой или приложением

  • Нужно ли для этого реализовать удаленный сервис?
  • Если это удаленный сервис, он должен быть ограничен или неограничен?

0 ответов

Другие вопросы по тегам