实时更改PreferenceActivity中的App Proxy设置

时间:2017-10-15 20:05:05

标签: java android android-activity proxy preferenceactivity

我有MainActivity和PreferencesActivity。 PreferencesActivity允许用户切换"使用代理"设置。当我从PreferencesActivity回到MainActivity时,我希望我的新设置能够立即运行,但只有在我关闭并再次打开应用程序后它们才能工作。

我在MainActivity的onCreate

中使用此方法设置代理设置
private void setProxy(String host, String port)
{
    System.setProperty("http.proxyHost", host);
    System.setProperty("http.proxyPort", port);
    System.setProperty("https.proxyHost", host);
    System.setProperty("https.proxyPort", port);
}

看起来像这样(简化代码)

if(preferences.getBoolean("use_proxy"))
{
    setProxy(proxyHost, proxyPort);
}
else
{
    resetProxy();
}

理论上如果我使用下一个代码从Preferences Activity返回到MainActivity,它应该可以工作

Intent intent = new Intent(PreferencesActivity.this, MainActivity.class);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);

但它没有。虽然MainActivity的onCreate方法正在执行并设置代理,但在用户手动重新启动应用程序之前,网络无法通过代理工作。

最后我找到了唯一的工作方式,但我不确定它是否合适。当我关闭PreferencesActivity并回到MainActivity

时,我使用此代码
PackageManager packageManager = c.getPackageManager();// c - PreferencesActivity context
Intent intent = packageManager.getLaunchIntentForPackage(c.getPackageName());
ComponentName componentName = intent.getComponent();
Intent mainIntent = IntentCompat.makeRestartActivityTask(componentName);
c.startActivity(mainIntent);
System.exit(0);

这样做很好,但据我所知,不建议使用System.exit (0);finish的使用在这种情况下不起作用。

问题是强制在不关闭用户应用程序的情况下强制执行PreferenceActivity更改并自动重启应用程序的正确方法?

1 个答案:

答案 0 :(得分:0)

onCreate - 首次创建活动时调用。这是您应该进行所有常规静态设置的地方:创建视图,将数据绑定到列表等。此方法还为您提供包含活动的先前已冻结状态的Bundle(如果有)。

onResume - 当活动开始与用户交互时调用。此时,您的活动位于活动堆栈的顶部,用户输入将转到活动堆栈。

因此,如果您想从PreferenceActivity获取您设置的值,请​​尝试将此语句放在onResume()而不是onCreate()

@Override
protected void onCreate(Bundle savedInstanceState) {
    //.. 
    preferences = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
}

@Override
protected void onResume() {
    super.onResume();
    if(preferences.contains("use_custom_proxy_settings_key") &&
         preferences.getBoolean("use_custom_proxy_settings_key", false)) {
              if(preferences.contains("custom_proxy_host_key") &&
                    !preferences.getString("custom_proxy_host_key", proxyHost).isEmpty() &&
                    preferences.contains("custom_proxy_port_key") &&
                    !preferences.getString("custom_proxy_port_key", proxyPort).isEmpty() )
              proxyHost = preferences.getString("custom_proxy_host_key", proxyHost);
              proxyPort = preferences.getString("custom_proxy_port_key", proxyPort);
    }

    if (preferences.contains("use_proxy_key") && preferences.getBoolean("use_proxy_key", false))
    {
          Log.d("MainActivity proxy set","proxyHost: "+ proxyHost + ", proxyPort: " + proxyPort);
          setProxy(proxyHost, proxyPort);
    }
    else
    {
        resetProxy();
          //setProxy("", "");
          Log.d("MainActivity proxy set","proxyHost: "+ System.getProperties()
            .getProperty("https.proxyHost") +
            ", proxyPort: " + System.getProperties().getProperty("https.proxyPort"));
    }
}
  

在没有任何flagsstartActivity(new Intent(this, PreferenceActivity.class));

的情况下启动意图