0

バックグラウンド

私が開発しているアプリには、スプラッシュ アクティビティとメイン アクティビティの少なくとも 2 つのアクティビティがあります。スプラッシュ アクティビティがメイン アクティビティを呼び出します。

場合によっては (ここでは、アプリの最初の実行のみであると仮定しましょう)、スプラッシュ アクティビティはブール値のエクストラを (intent.putExtra を使用して) インテントに true に追加し、メイン アクティビティは を使用してそれを読み取ります。

getIntent().getBooleanExtra(...,false);

問題

スプラッシュ アクティビティの後にメイン アクティビティを開いたときに、フラグを true として表示したいだけです。

これが、私が(onCreateで、フラグを取得した直後に)呼び出そうとした理由です:

getIntent().removeExtra(...);

別のアプローチ(このウェブサイトによると)は次のとおりです。

final Intent newIntent = new Intent();
setIntent(newIntent);

別のアプローチは次のとおりです。

getIntent().putExtra(..., false);

これらのいずれも機能しません。何らかの理由で、場合によっては、フラグがまだ true として返されます。

例として、ホーム ボタンを押して (メイン アクティビティがフォアグラウンドにある場合)、負荷の高いアプリ (カットザロープ ゲームやベンチマーク アプリなど) を起動し、次を使用してアプリに戻ることができます。ランチャー。

この場合 (常に発生するとは限りません)、スプラッシュ アクティビティは表示されませんが、代わりにメイン アクティビティが表示されます。フラグ自体はまだ true に設定されていますが、 onCreate を再度呼び出します。

質問

なぜ発生するのですか?インテントがリセットされないのはなぜですか?

これをエレガントな方法で克服する方法はありますか?

「savedInstanceState」が null でない場合、フラグを無視しても安全ですか?

4

1 に答える 1

0

VM が破棄され、再起動されているようです。一部のデバイスで、VM が再作成されると、起動アクティビティに入る代わりに、最後に実行されたアクティビティが保存された状態から再構築されることを確認しました。アクティビティの意図で状態を保存しようとしているように聞こえるので、おそらく問題の原因はそこにあります。

このような問題を回避するための重要な鍵は、 onCreate に渡される savedInstanceState バンドルが常に null であることを覚えておくことです。これは、アクティビティが作成されている場合new、ローテーション後の再構築などの他のすべての場合、または VM が取り壊された場合 (現状のまま)おそらくあなたの場合) onCreate に渡されるsavedInstanceバンドルはnullではありません..私のアドバイスは、savedInstanceStateがnullのときにローカル状態(フラグの初期値)を初期化する意図を使用することです。あなた自身の意図、あなたの状態をsavedInstanceバンドルに保存してください.. EG

  class Someactivity extends Activity {
       private static final STATE_FLAG = "flagState";
       private boolean someFlag;

       protected void onCreate (Bundle savedInstanceState) {

          final Intent intent = getIntent();

          if(savedInstanceState==null) {
             // Brand new, set from intent
             someFlag = intent.getBooleanExtra(STATE_FLAG, false);
          } else {
             // Restored, set from saved instance
             someFlag = savedInstanceState.getBoolean(STATE_FLAG, false);
          }

       }

       protected void onSaveInstanceState (Bundle outState) {
          // Save any updates to our activity state
          outState.putBoolean(STATE_FLAG, someFlag);
       }
    }
于 2013-08-04T12:58:34.217 に答える