web-dev-qa-db-ja.com

「activity.onCreate()」メソッドが複数回呼び出されるのは正常ですか?

OnCreateメソッドにActivityのコードがあり、3回呼び出されていることに気付きました。それは正常な動作ですか?ありがとう。

16
MyNameIsZero

アクティビティライフサイクル に関するドキュメントを読むことをお勧めします。

OnCreateは、アクティビティの存続期間ごとに1回だけ呼び出されます。しかし、あなたの活動が殺されて生き返る原因となる可能性のある状況はたくさんあります。したがって、onCreateが再度呼び出されます。

これを適切にサポートするために、状態情報をonSaveInstanceStateに保存し、作成時に取得した状態バンドルから復元できます。

26
Cheryl Simon

予想される場合を除いて、新しいスレッドまたは実行可能ファイルを作成するアクティビティ(onCreate)のみが2回呼び出されることを確認しました。 (これはAndroidのバグだと思います)。

解決策は簡単です(あなたはそれを気に入らないかもしれませんが:p)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash_screen);

        if(savedInstanceState == null){
            // everything else that doesn't update UI
        }
    }
21
M. Usman Khan

アクティビティ構成で、AndroidManifestで次のステートメントを設定して、構成の変更を独自に処理することもできます。

Android:configChanges="orientation|keyboardHidden"

詳細については、 公式ドキュメント をご覧ください。

1
dleal

場合によっては、複数回のロギングが原因である可能性があります。アプリケーションをデバッグモードで実行し、コードが2回実行されるのか、それとも単に複数回ログに記録されるのかを確認します。

ロギングだけの場合は、この質問の私の答えを確認してください: AVDで情報を3回表示するLogcat

0
Saman Sattari

私も同様の問題を抱えていました。それはMobileAdsが原因でした。 super.onCreate(...)の前にそれらを初期化した後、問題はなくなりました。

0
Mike

以下は、私が遭遇した(そして解決した)シナリオであり、あなたが説明している振る舞いを生み出します:

OnTouchをトリガーするイベントは3つあります-1。Android.view.MotionEvent.ACTION_UP2。Android.view.MotionEvent.ACTION_DOWN 3.Android.view.MotionEvent.ACTION_MOVE。

多くの場合、これら3つのイベントすべてが同時に発生して、OnTouchリスナーがトリガーされます。このリスナーを使用して(startActivity()に渡されたインテントを介して)アクティビティを起動すると、アクティビティでOnCreateを複数回呼び出すこの動作を再現できます(この例では3)。

アクティビティの開始に使用しているのがこのリスナータイプではない場合は、アクティビティをトリガーしているリスナーのドキュメントを調べて、同様のシナリオが発生しているかどうかを確認することをお勧めします。 1つのイベントだけがリスナーをトリガーするわけではない可能性があります。

0
josiah

これは、開発者設定で[アクティビティを終了しない]がオンになっている場合にも発生する可能性があります。

0
Grant Park