如何从android前台(vpn)服务观察集合

时间:2018-04-20 08:31:38

标签: android observable foreground-service android-vpn-service

我有一个单例类,我的VPN隧道有“阻止/允许逻辑”。不会发送发送到隧道的数据包,允许应用程序基于容差列表绕过,因此它可以表现为防火墙的简单实现。

我想要做的是,当我更改被阻止的应用程序包名称的Set<String>时,我希望服务线程再次使用此被阻止的应用程序集运行vpnservice.builder.establish()

显而易见的选择 - 如果服务为extends LifecycleServiceas shown here,则为“普通”前台服务。但是,我的服务必须延长android.net.VpnService实施LifecycleOwner。可能的实现(需要进行一些修改)is shown here

我的问题是:

  1. 我的VPN服务是否有更好,更清洁,更优雅的方式来观察我的单件类中的blockedPackageName集合中的更改?
  2. 如果没有其他办法,实施LifecycleOwner会以我期望的方式运作(基本上我是如何描述的)?
  3. 如果(2),是否足以在我的服务的onCreate和onDestroy方法中添加lifecycle.handleLifecycleEvent(Lifecycle.Event.XXXX);(见下文)?这些除了防止内存泄漏之外还做了什么吗?

    //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);
    }
    
  4. P.S。:我阅读了有关Lifecycle组件的官方文档,但是我找不到足够的代码示例来解决我的案例。

1 个答案:

答案 0 :(得分:0)

我找到的最佳解决方案是从单例类发送具有自定义意图的广播,并在启动时在vpnservice类中为此意图注册广播接收器。 对于从任何课程发送广播,你需要上下文 - 幸运的是,我已经在我的单身中需要上下文,context.getApplicationContext()可以正常工作而不会泄漏。