onNewIntent() なるメソッドを使っていました。onCreate() や onPause(), onResume() 等はライフサイクルメソッドとしてお馴染みですが、onNewIntent() はあまり見たことがありません。この onNewIntent() が何者なのか調べてみました。以下は Android プログラマーにとってお馴染みの Activity のライフサイクルです。すっかり体に染み込んでいることでしょう。この中に
onNewIntent() は存在しません。onNewIntent() を理解する前に、まず Activity の起動方法を理解しなくてはなりません。Activity#startActivity() で特に何も指定せず、普通に Activity を起動すると、目的の Activity のインスタンスが新規作成されます。しかし AndroidManifest.xml で
android:launchMode="singltTop" 属性が指定されている Activity を起動したり、または startActivity() を呼び出す時に、FLAG_ACTIVITY_SINGLE_TOP フラグを指定すると、目的の Activity が既に存在し、且つそれが Activity スタックの最上位にある場合、新しい Activity インスタンスが生成されるのではなく、既存のインスタンスが再利用されます。なので Activity の二重起動を防ぐことができます。この時に onNewIntent() が呼び出されます。どのタイミングで呼び出されるかというと以下の赤枠の部分です。
これを見ると分かるように、
onNewIntent() が呼び出される場合 onCreate() は実行されません。逆に onCreate() が実行される場合は onNewIntent() は実行されません。onNewIntent() へは、Activity を呼び出すのに使われた Intent が引数として渡されます。Intent には Activity へ渡す引数が含まれています。通常のシーケンスであれば onCreate() で Intent を処理しますが、singleTop の場合、onCreate() が実行されないので、それに代わる何らかのタイミングが必要になります。それが onNewIntent() です。
Firebase HTTP URLs 実装のサンプルコード を見ると以下コードが見られます。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_schedule);
onNewIntent(getIntent());
}
onCreate() の中で onNewIntent() を直接呼び出しています。onCreate() と onNewIntent() どちらでも同じ処理をやりたいということなのでしょうが、コールバックを直接呼び出すというのはちょっと強引な気がします。ここはメソッドを一つ用意して、両者から呼び出す方が自然ではないでしょうか。

0 件のコメント :
コメントを投稿