Клиент Socket.io на android отключается через 5 минут
Я реализовал клиент Socket.io на Android, мне удалось инициализировать сокет в неограниченном сервисе, но проблема в том, что он отключился через 5 минут, когда приложение работает в фоновом режиме и телефон заблокирован. Если приложение находится на переднем плане, соединение остается живым бесконечно.
Ситуация по отключению:
- Сервис все еще работает
- Разъем отключен по неизвестной причине
- Экземпляр сокета создается в классе Singelton, и экземпляр всегда остается неизменным в жизненном цикле, я проверил хэш-код для экземпляра сокета.
- Я также реализовал решение для пинг-понга, но оно не работает.
- Проверил логи сервера и обнаружил, что сокет отключен для пользователя.
- Я даже пытался перезапустить службу, но после перезапуска не установил соединение.
- Единственный способ подключить сокет снова, чтобы убить приложение и перезапустить приложение.
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());
}
};
}
Примечание: я хочу, чтобы служба работала в фоновом режиме все время, и она не должна быть уничтожена системой или приложением
- Нужно ли для этого реализовать удаленный сервис?
- Если это удаленный сервис, он должен быть ограничен или неограничен?