Сервис запущен методом
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
Комментариев нет:
Отправить комментарий