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


150

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

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

  • 検索ダイアログが開始されました
  • アクティビティに発動した検索意図
  • onPause()
  • onNewIntent()
  • onResume()

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

回答:


294

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

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

onResume()利用してすべてのセットアップロジックを実行しますgetIntent()


@Rodjaあなたは、この上のコメントしてくださいますstackoverflow.com/questions/19092631/...を
デベロッパー

3
元の質問に関連する:検索を処理するコードをに移動IntentするonResume()と、アクティビティは再開するたびに検索を実行しようとしますが、希望する動作ではない可能性があります。
Tony Chan

1
Rodjaさんのコメント:アクティビティのライフサイクルの観点から見ると、onNewIntent()の前にonPause()を呼び出す必要があります。Androidでは、このように設計する必要はありませんでした。あなたの活動は、既にそのライフサイクルを経て、resume()を経ています。AndroidがonPause()を呼び出してから、onResume()を再度呼び出す必要はありません。アプリが再開された場合、OSは単にonNewIntent()を呼び出し、再開された状態を維持できます。
Sani Elfishawy 2014年

Rodjaのコメント:アクティビティのライフサイクルの観点から、onNewIntent()の前にonPause()を呼び出す必要があります。Androidは、そのように設計する必要がありませんでした。あなたの活動はすでにライフサイクルを経て再開しています。行為が再開された場合、彼らは単にonNewIntent()を呼び出し、再開された状態を維持できます。Androidのシーケンスの問題は、ユーザーアクションによるonPauseとバックグラウンドインテントによるonPauseを区別できないことです。ユーザーアクションの場合にのみonPauseを実行したい場合、onPause()を実行する理由が将来までわからないため、うんざりしています。
Sani Elfishawy 2014年

注意すべき重要な点は、getIntent()が元のIntentを返すことです。setIntent(Intent)を使用して、新しいインテントに更新できます。
linuxjava 14年

15

注:別のメソッドからライフサイクルメソッドを呼び出すことはお勧めできません。以下の例では、アクティビティタイプに関係なく、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
}

59
一般に、ライフサイクルメソッドを直接呼び出すことはお勧めできません。無害かもしれないし、あるいはonNewIntent()の基本実装がonPause()がすでに呼び出されていると想定しているかもしれません。おそらく、両方の場所から呼び出し可能なメソッドにアプリのコードをカプセル化する方が安全です。
BernalKC

12
同意した。このアプローチを使用して、いくつかのエッジケースに遭遇しました。できるだけ避けてください。
Saad Farooq

3
うん..私もこれを避けることに同意します...これはonCreateからonNewIntentを呼び出したい人のためのものでもありました。
Pawan Maheshwari、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.