2013年2月4日月曜日

minSdkVersion16以上ではGCMBroadcastReceiverのintent-filterにcategory指定が要らない

4.1以上の端末と、それより下のAPIレベルの端末で、GCMサーバーからメッセージを受信した際のインテントの内容が異なることに気がついた。


4.1(APIレベル16)以上
02-04 13:25:37.552: V/GCMIntentService.onMessage:70(11555): Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=my.app.package cmp=my.app.package/.GCMIntentService (has extras) }


4.0.3(APIレベル15)

02-04 13:46:33.894: V/GCMIntentService.onMessage:70(380): Intent { act=com.google.android.c2dm.intent.RECEIVE cat=[my.app.package] cmp=my.app.package/.GCMIntentService (has extras) }


16以上だと、インテント内にカテゴリー指定がなく、パッケージに変わっている。

GCMのドキュメントにも、minSdkVersionを16以上に指定した場合は、マニフェストに記述するcom.google.android.gcm.GCMBroadcastReceiverのintent-filterで、categoryのname値にパッケージ名を指定する必要がないとある。

Notice that android:name in the category tag must be replaced by your application's package name (and the category tag is not required for applications targeted to minSdkVersion 16 and higher).


メッセージが送られる端末に応じて、インテントにカテゴリーを含めるのか、パッケージ名を含めるのか、振り分けているようだ。


minSDKVersionを16以上にすると、さらに、permission.C2D_MESSAGEの要求も要らなくなるし、マニフェストがスッキリするね。