从PreferenceActivity实时更改App Proxy设置

从PreferenceActivity实时更改App Proxy设置

问题描述:

我有MainActivity和PreferencesActivity。 PreferencesActivity允许用户切换“使用代理”设置。当我从PreferencesActivity返回到MainActivity时,我希望我的新设置立即生效,但它们只在关闭并再次打开应用程序后才有效。从PreferenceActivity实时更改App Proxy设置

我在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(); 
} 

设置使用这种方法的代理设置从理论上讲,如果我会回来的偏好活动到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更改而不关闭应用程序的用户,并自动重新启动应用程序?

+0

可以还张贴PreferenceActivity和MainActivity的地方越来越代理值的一部分? '放置并获取preferenceActivity的值时,不必重新启动或关闭应用程序。 – Jerrol

+0

@Jerrol是的,请看这里,我已经放在谷歌文件的一些代码,以免扩大这个问题https://docs.google.com/document/d/1OYrJPNP0EynyUvpJKm1124F5E2mKdVer-wG8v7qCxLA/edit?usp=sharing 并且我还捕获了我正在调试应用程序的视频(在视频上,它曾在3:33上工作过一次,但仅在调试模式下) - https:// youtu。be/QLRa2yHtDWQ 我会稍微解释一下:如果没有选中“使用代理”复选框,则不应该加载没有代理的数据,否则一切都应该没有任何问题 –

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));

+0

对不起,但你不明白什么是问题。在我的情况下,activity从begin开始执行,OnCreate方法在我从PreferenceActivity返回后执行,并且代理设置正在设置,但没有奏效。我发现什么是问题。这是我的错误。当我从PreferencesActivity回来时,我有AsyncTask与旧请求正在工作,我应该停止他,并在我设置代理参数后重新启动。 –

+0

但第二个问题是当我禁用代理它不禁用,并且下一个请求正在发送,但不应该。我认为它比看起来更深。 resetProxy函数在问题中描述。我认为为它创造新的问题会更好 –