1

エクストラを使用して B からアクティビティ A を開始し、onCreate のエクストラのタイプに基づいて何らかのプロセスを実行すると、正常に動作します。

しかし、向きを変更すると、同じ古い意図がシステムによって再配信され、onCreate をもう一度実行するため、プロセス全体が再開されます。

私のコードは、古いインテントが配信されない場合に onCreate が呼び出されたときに、アクティビティの以前の状態を完全に復元します。しかし、システムが再配信するため、私のアクティビティはそれが新しい意図であると考え、プロセス全体をもう一度やり直します。

フラグを立ててみましたintent.getFlags() != Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY。このフラグは、ホーム ボタンを長押しし、アクティビティが履歴から開始された場合の再配信を防ぎますが、向きの変更には影響しません。

別のスレッドDirty Fixでダーティ フィックスが提案されましたが、この問題に対処する適切な方法があるかどうか疑問に思っています。

前もって感謝します

4

2 に答える 2

2

savedInstanceState を使用して、アクティビティまたはフラグメントが、向きの変更を含むあらゆるものから復元されるかどうかを判断します。アクティビティ/フラグメントが復元されると、savedInstanceState は null になります。

public void onCreate(Bundle savedInstanceState) {
    ...
    boolean isRedeliver = savedInstanceState != null || (intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0;
    ...
}

この手法はfragment の公式ドキュメントでも使用されています。

    if (savedInstanceState == null) {
        // During initial setup, plug in the details fragment.
        DetailsFragment details = new DetailsFragment();
        details.setArguments(getIntent().getExtras());
        getFragmentManager().beginTransaction().add(android.R.id.content, details).commit();
    }
于 2015-09-30T01:45:47.307 に答える
1

この問題に対する「クリーンな」解決策は、フラグメントを使用することです。

独自の Fragment サブクラスを作成します。その onCreate で、必ず setRetainInstance(true) を呼び出してください。その onCreate で、プロセスを開始できます。何らかの作業を行うためだけの場合は、onCreateView で null を返します。

アクティビティの onCreate で: - まず、独自の Fragment の現在のインスタンスを見つけようとします。- 見つからない場合は、新しいものを作成し、これをフラグメント トランザクションにコミットします。

setRetainInstance(true) を呼び出し、Activity の onCreate で新しい Fragment を作成する前に最初にそれを見つけようとすることで、ローテーション後も同じ Fragment インスタンスを保持し、Fragment の onCreate が再び呼び出されることはありません。

于 2013-02-06T20:41:00.450 に答える