web-dev-qa-db-ja.com

onNewIntent()ライフサイクルと登録済みリスナー

onNewIntent() を介して検索ダイアログからインテントを受信するためにsingleTopアクティビティを使用しています。

私が気づいたのは、onPause()onNewIntent()の前に呼び出され、その後onResume()を呼び出すことです。視覚的に:

  • 検索ダイアログが開始されました
  • アクティビティに対して発生した検索インテント
  • onPause()
  • onNewIntent()
  • onResume()

問題は、onResume()に登録されているリスナーがonPause()で削除されることですが、onNewIntent()呼び出しの内部で必要になることです。それらのリスナーを利用可能にする標準的な方法はありますか?

136
DJayC

onNewIntent()は、スタック内の別の場所で既に実行されているため、onCreate()を呼び出せないsingleTopアクティビティのエントリポイントとして使用されます。したがって、アクティビティのライフサイクルの観点から、onPause()の前にonNewIntent()を呼び出す必要があります。これらのリスナーをonNewIntent()内で使用しないようにアクティビティを書き直すことをお勧めします。たとえば、ほとんどの場合、私のonNewIntent()メソッドは次のようになります。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    // getIntent() should always return the most recent
    setIntent(intent);
}

onResume()を利用することにより、getIntent()ですべてのセットアップロジックが発生します。

273
Rodja

注:別のメソッドからライフサイクルメソッドを呼び出すことはお勧めできません。以下の例では、アクティビティの種類に関係なく、onNewIntentが常に呼び出されるようにしました。

OnNewIntent()は、アクティビティが初めて作成されたときを除き、singleTop/Taskアクティビティに対して常に呼び出されます。その時点で、onCreateは、このスレッドで要求されるいくつかのクエリにソリューションを提供するために呼び出されます。

次のようにonCreateメソッドに入れることで、常にonNewIntentを呼び出すことができます。

@Override
public void onCreate(Bundle savedState){
    super.onCreate(savedState);
    onNewIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  //code
}
14