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 件のコメント :
コメントを投稿