22373


Androidアプリでプッシュ通知の効果測定をしたいと思い、そのために通知をタップしたことによる起動かそれ以外による起動かを判別したいと思っています。

`Activity#onStart()`で`Activity#getIntent()`より`Intent`を取得し、時起動方法によってIntentが次のようになっていることはわかりました。

  * Android Studioやランチャーなどから起動させた場合 (1)

[code]

    Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.example.sakaguchi/.MainActivity }
[/code]

  * 通知をタップして起動させた場合 (2)  
(PendingIntentにはactionやcategoryは設定していない)

[code]

    Intent { flg=0x4400000 cmp=com.example.sakaguchi/.MainActivity bnds=[0,363][1080,555] }
[/code]

ですが、おそらくその時のタスクが生きているからだと思うのですが、例えば通知から起動させた時に以下のような挙動になっています。

  1. 受信した通知をタップしてアプリを起動させる  
→onStart()にて(2)のIntentを取得

  2. ホームボタンでホームへ戻る
  3. ランチャーからアプリを起動させる  
→onStart()にて再び(2)のIntentを取得

ランチャーから起動させた後プッシュ通知より起動させた時はこうならずにそれぞれのIntentを取得することができます。

どのようにすればユーザーが通知からあるいはそれ以外から起動したことを判別できるでしょうか？


CC BY-SA 3.0
2016-01-21T06:05:17.963
21146
2016-02-22T05:19:00.850
9710
question
android android-intent
通知からの起動かランチャーなどからの起動かを判別したい


`activity-alias` タグを利用して AndroidManifest.xml で Activity
の宣言をすることで、起動方法の判別ができるかと思います。

[code]

    <activity
      android:name="MainActivity"
    >
        <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity-alias
        android:name="MainActivityAlias"
        android:targetActivity="MainActivity" />
    
[/code]

色々と要素は省略していますが、上記のように AndroidManifest.xml を記入することで、

[code]

    class MainActivity extends Activitiy {
    
        @Override
        protected void onCreate(Bundle savedInstance) {
            String className = getIntent().getComponent().getClassName();
            if(className.equals(MainActivity.class.getName() + "Alias")) {
                // エイリアスからの起動
            }else {
                // ランチャーからの起動
            }
        }
    }
    
[/code]

と言ったように、起動元を判断することができるはずです。


CC BY-SA 3.0
2016-02-22T05:19:00.850
22373
2016-02-22T05:19:00.850
7949
21146
answer