У меня есть одноэлементный класс с «логикой блокировки/разрешения» для моего VPN-туннеля. Пакеты, отправляемые в туннель, не отправляются, приложениям разрешено обходить их на основе разрешенного списка, поэтому он может вести себя как простая реализация брандмауэра.
Что я хочу сделать, так это изменить Set<String>
имен пакетов заблокированных приложений, я хотел бы, чтобы поток службы снова запускал vpnservice.builder.establish()
, используя этот набор заблокированных приложений.
Очевидный выбор для этого - в случае «обычной» службы переднего плана, если служба extends LifecycleService
, как показано здесь а>. Однако моя служба должна расширять android.net.VpnService
, что не реализует LifecycleOwner
. Возможная реализация (с некоторыми необходимыми изменениями) показана здесь.
Мои вопросы:
- Есть ли лучший, более чистый и элегантный способ для моего VPN-сервиса отслеживать изменения в моей коллекции BlockPackageName в моем классе singleton?
- Если нет другого пути, будет ли реализация
LifecycleOwner
работать так, как я ожидаю (как я это описал, в основном)? Если (2), достаточно ли добавить
lifecycle.handleLifecycleEvent(Lifecycle.Event.XXXX);
в методы onCreate и onDestroy моего сервиса (см. ниже)? Делают ли они что-нибудь, кроме предотвращения утечек памяти?//MyVpnService class @Override public void onDestroy() { Log.i(TAG, "Destroyed."); stopVpn(); //what is the purpose of this line for my goals? lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY); }
P.S.: Я читал официальную документацию по компонентам жизненного цикла, но не смог найти достаточно примеров кода для своих случаев, чтобы прояснить ситуацию.