【问题标题】:Disable VPN upon application exit在应用程序退出时禁用 VPN
【发布时间】:2025-12-11 05:50:02
【问题描述】:

所以我在一家需要VPN 才能连接到数据库服务器的公司工作。我在onPause/onStop 上以编程方式从 VPN 服务断开连接(或禁用它)时遇到问题。

为了确保用户确实连接到VPN,我正在使用网络侦听器,如果用户未连接,则会显示一个对话框并将用户导航到VPN Settings Configuration。一旦用户连接并恢复应用程序,侦听器就会识别出VPN IP,并且一切运行良好。

我的问题是,一旦用户停止使用该应用程序,我想禁用 VPN connection。因此,我一直在尝试寻找一种禁用VPN connection 的解决方案,而不要求用户再次进入VPN 设置。是否可以选择以编程方式关闭 VPN 而无需导航到 VPN 设置页面?

网络服务:

public class NetworkSchedulerService extends JobService implements
        ConnectivityReceiver.ConnectivityReceiverListener {

    private ConnectivityReceiver mConnectivityReceiver;

    @Override
    public void onCreate() {
        super.onCreate();
        mConnectivityReceiver = new ConnectivityReceiver(this);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_NOT_STICKY;
    }

    @Override
    public boolean onStartJob(JobParameters params) {
        registerReceiver(mConnectivityReceiver, new IntentFilter(Constants.CONNECTIVITY_ACTION));
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        unregisterReceiver(mConnectivityReceiver);
        return true;
    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        String message = isConnected ? "מחובר לרשת" : "אין חיבור פעיל לרשת";
        Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();
    }
}

听众:

private void scheduleJob() {
    JobInfo myJob = new JobInfo.Builder(0, new ComponentName(this, NetworkSchedulerService.class))
            .setRequiresCharging(true)
            .setMinimumLatency(1000)
            .setOverrideDeadline(2000)
            .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
            .setPersisted(true)
            .build();

    JobScheduler jobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
    jobScheduler.schedule(myJob);
}

@Override
protected void onStop() {
    stopService(new Intent(this, NetworkSchedulerService.class));
    super.onStop();
}

@Override
protected void onStart() {
    super.onStart();
    Intent startServiceIntent = new Intent(this, NetworkSchedulerService.class);
    startService(startServiceIntent); // INTERNET LISTENER
}

对话框:

public void dialogVPN() {
    builder = new AlertDialog.Builder(LoadingSplash.this);
    builder.setMessage("Please ensure VPN Connection");
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Intent intent = new Intent("android.net.vpn.SETTINGS");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivityForResult(intent, 10);
        }
    });
    builder.show();
}

还有 returnConnType:

public String returnConnType() {
    ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(this.CONNECTIVITY_SERVICE);
    String result = "None";
    if (connectivityManager != null) {
            Network network = connectivityManager.getActiveNetwork();
            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
            if (capabilities == null) {
                result = "None";
            }
            if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
                result = "WIFI";
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
                result = "MOBILE";
            } else if (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {
                result = "VPN";
            }
    }
    return result;
}

关于如何解决这个问题的任何建议?一个合适的解决方案或替代方案将不胜感激。

【问题讨论】:

    标签: java android vpn


    【解决方案1】:

    我认为您不能使用 Android 提供的 API 从应用程序内部禁用 VPN 设置,因为我不知道任何此类 API。但是,作为一种解决方法,您可以考虑执行以下操作。

    退出应用程序时(按下后退按钮),您可以使用相同的侦听器弹出另一个对话框,告知用户关闭 VPN。因此,关闭 VPN 将遵循用户在打开 VPN 时必须执行的相同任务。

    当用户使用主页按钮退出应用程序时,您可以考虑在退出活动的onDestroy 函数中使用JobScheduler,以便您可以在后台服务中检查 VPN 连接是否处于活动状态应用程序未运行并创建通知,告诉用户 VPN 处于活动状态。然后单击通知,将用户重定向到 VPN 配置设置并引导用户将其关闭。

    希望有帮助!

    【讨论】:

    • 智能解决方案。希望我能想到它! :)
    • 很高兴知道您喜欢它!谢谢。 :)
    • 很高兴知道我可以提供帮助。如果这有帮助,请接受答案。 :)
    【解决方案2】:

    感谢@Reaz,我现在设法找到了合适的解决方案。 在奥利奥上测试 万一别人有兴趣.. 应用

    implementation 'android.arch.lifecycle:extensions:1.1.1'
    

    AppLifecycleObserver

    public class AppLifecycleObserver extends MultiDexApplication implements LifecycleObserver {
    
        public static final String TAG = AppLifecycleObserver.class.getName();
        Notifications notif = new Notifications();
        Context mContext;
    
        public AppLifecycleObserver(Context context) {
            mContext = context;
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        public void onEnterForeground() {
            Log.v(TAG,"FOREGROUND");
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        public void onEnterBackground() {
            Log.v(TAG,"BACKGROUND");
            notif.createVPNNotification(mContext,"VPN","Please make sure to turn VPN off");
        }
    }
    

    在任何你想实现的活动上@onCreate:

                AppLifecycleObserver appLifecycleObserver = new AppLifecycleObserver(this);
                ProcessLifecycleOwner.get().getLifecycle().addObserver(appLifecycleObserver);
    

    【讨论】: