2017-10-15 6 views
0

MainActivity 및 PreferencesActivity가 있습니다. PreferencesActivity는 사용자가 "프록시 사용"설정을 전환 할 수있게합니다. PreferencesActivity에서 MainActivity로 돌아 왔을 때, 새로운 설정이 즉시 작동되기를 원하지만, 응용 프로그램을 닫고 다시 열면 작동합니다. 내가 MainActivity에 환경 활동에서 돌아 오는 것입니다 경우App Proxy 설정을 PreferenceActivity에서 실시간으로 변경하십시오.

나는 이론적으로 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(); 
} 

에서이 방법을 사용하여 프록시 설정을 설정 작동해야하는 다음 코드를 사용하여

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

당신은 또한 게시 할 수있는 flags없이 의도를 시작 PreferenceActivity를 프록시의 값을 받고 MainActivity의 일부? 'coz 응용 프로그램을 다시 시작하거나 닫을 때 preferenceActivity 값을 가져 오거나 가져올 필요가 없습니다. – Jerrol

+0

@Jerrol 예, 여기를 보시기 바랍니다.이 질문을 펼치지 않기 위해 일부 코드를 Google 문서에 넣었습니다. https://docs.google.com/document/d/1OYrJPNP0EynyUvpJKm1124F5E2mKdVer-wG8v7qCxLA/edit?usp=sharing 그리고 비디오를 캡쳐했습니다 (비디오에서는 3:33에 한 번만 디버그 모드로 작동했습니다) - https : // youtu./ QLRa2yHtDWQ 조금 설명해 드리겠습니다. "프록시 사용"확인란을 선택하지 않으면 프록시가없는 데이터가로드되어서는 안됩니다. 그렇지 않으면 모든 것이 문제없이 작동합니다. –

답변

0

onCreate - 활동이 처음 생성 될 때 호출됩니다. 여기서 뷰를 생성하고 목록에 데이터를 바인드하는 등의 일반적인 정적 설정을해야합니다.이 방법은 활동의 이전 고정 상태 (있는 경우)가 포함 된 번들을 제공합니다.

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

startActivity(new Intent(this, PreferenceActivity.class));

+0

미안하지만 문제. 내 경우에는 활동이 시작되고 OnCreate 메소드가 PreferenceActivity에서 돌아와서 실행 중이 었으며 프록시 설정이 설정되었지만 작동하지 않았습니다. 그리고 나는 문제가 무엇인지 발견했습니다. 그건 내 실수 였어. 내가 PreferencesActivity에서 돌아오고 있었을 때 나는 일하고 있던 오래된 요청으로 AsyncTask를 가졌다. 나는 그를 멈추고 프록시 params를 설정 한 후에 다시 시작해야만했다. –

+0

하지만 두 번째 문제는 프록시를 사용할 수 없게 설정하지 않고 다음 요청을 보내지 만 비활성화하지 않아야하는 경우입니다. 나는 그것이 보이는 것보다 더 깊다고 생각합니다. resetProxy 함수는 질문에 설명되어 있습니다. 나는 그것에 대한 새로운 질문을 만드는 것이 더 좋을 것이라고 생각한다. –

관련 문제