1

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

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

一个明显的选择 - 如果服务是“普通”前台服务extends LifecycleService如此处所示。但是,我的服务必须扩展android.net.VpnService,这没有实现LifecycleOwner此处显示了一种可能的实现方式(需要进行一些修改)。

我的问题是:

  1. 在我的单例类中,我的 VPN 服务是否有更好、更清洁、更优雅的方式来观察我的blockedPackageName 集合的变化?
  2. 如果没有其他方法,是否会LifecycleOwner以我期望的方式实施工作(基本上我是如何描述的)?
  3. lifecycle.handleLifecycleEvent(Lifecycle.Event.XXXX);如果(2),添加我的服务的 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);
    }
    

PS:我阅读了关于生命周期组件的官方文档,但我找不到足够的代码示例来说明问题。

4

1 回答 1

0

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

于 2018-04-21T13:20:13.767 回答