2017-10-15 5 views
0

私はMainActivityとPreferencesActivityを持っています。 PreferencesActivityを使用すると、ユーザーは「プロキシを使用する」設定を切り替えることができます。 PreferencesActivityからMainActivityに戻ったとき、私の新しい設定がすぐに機能したいのですが、アプリケーションを閉じてからもう一度開いた後でしか動作しません。私はMainActivityに環境設定Activityから戻ってくるかどう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の一部? 'あなたのpreferenceActivityの値を入れたり取得したりするときに、アプリケーションを再起動したり閉じたりする必要はありません。 – Jerrol

+0

@Jerrolはい、ここをクリックしてください。この質問を展開しないように、コードの一部をGoogleドキュメントに配置しました。https://docs.google.com/document/d/1OYrJPNP0EynyUvpJKm1124F5E2mKdVer-wG8v7qCxLA/edit?usp=sharing 私はアプリケーションをデバッグしているビデオをキャプチャしました(ビデオでは3:33に1回しか動作しませんでしたが、デバッグモードでのみ動作します) - https:// youtu。/ QLRa2yHtDWQ 少し説明します: "プロキシを使用する"チェックボックスが選択されていない場合、プロキシのないデータは読み込まれません。そうでなければ問題なく動作します。 –

答えて

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

はちょうどstartActivity(new Intent(this, PreferenceActivity.class));

+0

申し訳ありませんが、問題。私のケースでは、アクティビティが最初から実行されていて、OnCreateメソッドがPreferenceActivityから戻った後に実行されていました。プロキシ設定が設定されていましたが、動作しませんでした。そして私は何が問題であるかを見出しました。それは私の間違いでした。私はPreferencesActivityから戻って来ていたとき、私は仕事をしていた古い要求でAsyncTaskを持っていました。私はちょうど彼を止めて、プロキシパラメータを設定した後に再起動するべきでした。 –

+0

しかし、2番目の問題は、私が無効にしていないプロキシを無効にしているときで、次の要求が送信されているが、そうすべきではない。私はそれがより深いと思う。 resetProxy関数については、質問に記載されています。新しい質問を作成する方がいいと思う –

関連する問題