Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Android service не переподключается к серверу когда телефон заблокирован

Сервис запущен методом
Intent intent = new Intent(appContext, Connection_service.class); startService(intent);
В самом сервисе идет подключение к серверу
SocketAddress adr = new InetSocketAddress(java.net.InetAddress.getByName(... s.connect(adr, connectTime); s.setSoTimeout(readTime); s.setTcpNoDelay(true); s.setKeepAlive(true); inMes = new DataInputStream(s.getInputStream()); outMes = new DataOutputStream(s.getOutputStream());
В случае разрыва соединения переподключается тем же способом.
Вопрос в том, что если выключить надолго на телефоне экран(минут 10) то соединение пропадает и при переподключении не устанавливается с ошибкой: IOException: java.net.SocketTimeoutException: failed to connect to...
При этом сам сервис продолжает работать и пытается восстановить соединение. Интернет не пропадает, по крайней мере BroadcastReceiver с ConnectivityManager.CONNECTIVITY_ACTION не срабатывает. Соединение восстанавливается ТОЛЬКО после открытия Activity, при этом сам сервис не перезапускается.
Что это за режим такой для экономии батареи видимо? И почему соединение не восстанавливается после разблокировки экрана, а только после открытия Activity?


Ответ

Возможно, это работает Doze Mode в Marshmallow.
Проверка на возможность соединиться с сервером осуществляется на устройствах с SDK 23+ дополнительным запросом к PowerManager. Вообще полезно так делать:
if (connectivityManager.getActiveNetworkInfo() != null && connectivityManager.getActiveNetworkInfo().isConnected() && (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || !powerManager.isDeviceIdleMode() || powerManager.isIgnoringBatteryOptimizations())) { // do something }
Если нужен бродкаст о выходе из Doze, то можно вот так:
registerReceiver(br, new IntentFilter( PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED));
Попробуйте проверить сначала, оно ли это: добавьте приложение в вайтлист из настроек (Settings -> Battery -> Battery Optimization, и там для своего приложения включить "Не экономить") и посмотрите, что изменится.
Я в свое время делал доклад, загляните в презентацию, там есть еще интересные мелочи (c 15 по 30 слайды): http://www.slideshare.net/jollydroid/android-marshmallow-13112015

Комментариев нет:

Отправить комментарий