Как узнать, остановлена ​​ли ОС Android Сервис

Я написал VPN, используя Android VPNService, и он отлично работает. Когда я запускаю его, он создает службу переднего плана и отправляет весь трафик через мой VPN-сервер. Он также имеет внутренний механизм повторного подключения для повторного подключения VPN-сервера, если он отключается по какой-либо причине, без остановки самого сервиса.

Мне нравится, когда этот VPN-сервис работает постоянно. Но моя проблема в том, что этот VPN-сервис иногда останавливается после совершенно случайного периода (иногда это занимает всего 10 минут, но иногда он работает в течение 2-3 дней до остановки).

Поскольку время остановки совершенно случайное, и я не могу найти места в коде, создающего эту ситуацию (неделями занимался отладкой), я подумал, что, возможно, сама ОС Android по какой-то причине останавливает мой VPNService. Интересно, есть ли способ определить, остановила ли система мою службу извне или нет. Есть идеи?


person Afshin    schedule 04.12.2019    source источник


Ответы (1)


К сожалению, ОС Android по-прежнему может завершить службу при нехватке памяти и, возможно, в других ситуациях, даже если это служба, работающая в фоновом режиме!

Не только Android, но и все мобильные операционные системы оптимизируют использование оперативной памяти, убивая фоновые приложения.

Это сделано для того, чтобы приложению переднего плана был присвоен наивысший приоритет. Это обеспечивает бесперебойную работу текущего приложения и снижает нагрузку на систему.

Как упоминалось в этом сообщении, существует два подхода: Фоновая служба отключается в Android

  • Если вы реализуете службу, переопределите onStartCommand() и верните START_STICKY в качестве результата. Он сообщит системе, что даже если она захочет убить вашу службу из-за нехватки памяти, она должна создать ее заново, как только память вернется в норму.
  • Если вы не уверены, что первый подход сработает, вам придется использовать AlarmManager http://developer.android.com/reference/android/app/AlarmManager.html . Это системная служба, которая будет выполнять действия, когда вы скажете, например, периодически. Это гарантирует, что если ваша служба будет прекращена или даже весь процесс умрет (например, с принудительным закрытием) - он будет перезапущен AlarmManager на 100%.

У меня была эта проблема ранее, и я решил ее, создав службу, работающую вечно, даже если она была убита вручную или из системы, которую она воссоздала сама.

person dlammy    schedule 04.12.2019
comment
как я уже упоминал в своем посте, я уже вывел свою службу на передний план, и она уже возвращает START_STICKY. для AlaramManager я не уверен, что смогу использовать его для VPNService, потому что это какая-то особая служба. Итак, мой главный вопрос заключается в том, как я могу узнать, что служба убила мою систему по какой-либо причине (например, из-за нехватки памяти). - person Afshin; 04.12.2019