スポンサーリンク

2016年8月24日水曜日

Android Activity の onNewIntent() とは

Google のあるサンプルコードを見ていたら Activity の 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 件のコメント :

コメントを投稿