从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更改而不关闭应用程序的用户,并自动重新启动应用程序?
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"));
}
}
刚开始的意图没有任何
flags
,startActivity(new Intent(this, PreferenceActivity.class));
对不起,但你不明白什么是问题。在我的情况下,activity从begin开始执行,OnCreate方法在我从PreferenceActivity返回后执行,并且代理设置正在设置,但没有奏效。我发现什么是问题。这是我的错误。当我从PreferencesActivity回来时,我有AsyncTask与旧请求正在工作,我应该停止他,并在我设置代理参数后重新启动。 –
但第二个问题是当我禁用代理它不禁用,并且下一个请求正在发送,但不应该。我认为它比看起来更深。 resetProxy函数在问题中描述。我认为为它创造新的问题会更好 –
可以还张贴PreferenceActivity和MainActivity的地方越来越代理值的一部分? '放置并获取preferenceActivity的值时,不必重新启动或关闭应用程序。 – Jerrol
@Jerrol是的,请看这里,我已经放在谷歌文件的一些代码,以免扩大这个问题https://docs.google.com/document/d/1OYrJPNP0EynyUvpJKm1124F5E2mKdVer-wG8v7qCxLA/edit?usp=sharing 并且我还捕获了我正在调试应用程序的视频(在视频上,它曾在3:33上工作过一次,但仅在调试模式下) - https:// youtu。be/QLRa2yHtDWQ 我会稍微解释一下:如果没有选中“使用代理”复选框,则不应该加载没有代理的数据,否则一切都应该没有任何问题 –