質問: Androidアプリでプッシュ通知の効果測定をしたいと思い、そのために通知をタップしたことによる起動かそれ以外による起動かを判別したいと思っています。 `Activity#onStart()`で`Activity#getIntent()`より`Intent`を取得し、時起動方法によってIntentが次のようになっていることはわかりました。 * Android Studioやランチャーなどから起動させた場合 (1) ``` Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.sakaguchi/.MainActivity } ``` * 通知をタップして起動させた場合 (2) (PendingIntentにはactionやcategoryは設定していない) ``` Intent { flg=0x4400000 cmp=com.example.sakaguchi/.MainActivity bnds=[0,363][1080,555] } ``` ですが、おそらくその時のタスクが生きているからだと思うのですが、例えば通知から起動させた時に以下のような挙動になっています。 1. 受信した通知をタップしてアプリを起動させる →onStart()にて(2)のIntentを取得 2. ホームボタンでホームへ戻る 3. ランチャーからアプリを起動させる →onStart()にて再び(2)のIntentを取得 ランチャーから起動させた後プッシュ通知より起動させた時はこうならずにそれぞれのIntentを取得することができます。 どのようにすればユーザーが通知からあるいはそれ以外から起動したことを判別できるでしょうか?
回答: `activity-alias` タグを利用して AndroidManifest.xml で Activity の宣言をすることで、起動方法の判別ができるかと思います。 ``` ``` 色々と要素は省略していますが、上記のように AndroidManifest.xml を記入することで、 ``` class MainActivity extends Activitiy { @Override protected void onCreate(Bundle savedInstance) { String className = getIntent().getComponent().getClassName(); if(className.equals(MainActivity.class.getName() + "Alias")) { // エイリアスからの起動 }else { // ランチャーからの起動 } } } ``` と言ったように、起動元を判断することができるはずです。