Как наблюдать за коллекцией из службы переднего плана Android (vpn)

У меня есть одноэлементный класс с «логикой блокировки/разрешения» для моего VPN-туннеля. Пакеты, отправляемые в туннель, не отправляются, приложениям разрешено обходить их на основе разрешенного списка, поэтому он может вести себя как простая реализация брандмауэра.

Что я хочу сделать, так это изменить Set<String> имен пакетов заблокированных приложений, я хотел бы, чтобы поток службы снова запускал vpnservice.builder.establish(), используя этот набор заблокированных приложений.

Очевидный выбор для этого - в случае «обычной» службы переднего плана, если служба extends LifecycleService, как показано здесь . Однако моя служба должна расширять android.net.VpnService, что не реализует LifecycleOwner. Возможная реализация (с некоторыми необходимыми изменениями) показана здесь.

Мои вопросы:

  1. Есть ли лучший, более чистый и элегантный способ для моего VPN-сервиса отслеживать изменения в моей коллекции BlockPackageName в моем классе singleton?
  2. Если нет другого пути, будет ли реализация LifecycleOwner работать так, как я ожидаю (как я это описал, в основном)?
  3. Если (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.: Я читал официальную документацию по компонентам жизненного цикла, но не смог найти достаточно примеров кода для своих случаев, чтобы прояснить ситуацию.


person itarill    schedule 20.04.2018    source источник


Ответы (1)


Лучшим решением, которое я нашел, было отправить широковещательную рассылку с пользовательским намерением из класса singleton и зарегистрировать получателя широковещательной рассылки для этого намерения в классе vpnservice при запуске. Для отправки трансляции из любого класса нужен контекст — мне повезло, контекст в моем синглтоне уже нужен, для которого context.getApplicationContext() отлично работает без утечек.

person itarill    schedule 21.04.2018