今回やること
- Parseを使用し、今までdefaultのプッシュ通知を送っていたものを、Receiverを使った受け取りに変更する。
- AndroidWear対応として、NotificationにLargeIconを設定する
Parseでのプッシュ通知について
Parseの現状のメッセージの受け取り方では、メッセージを押した時に起動するアクティビティと、その小さなアイコンしか指定できない。
今回AndroidWearに対応させるためには、もっと細かくノーティフィケーション設定する必要がある!
現状:アプリの最初の登録などでsetDefaultPushCallbackを呼び、プッシュ通知を受け取れるように設定している。
PushService.setDefaultPushCallback(getApplicationContext(), MainActivity.class, R.drawable.ic_launchar);
これだけで、アイコン付きの標準のノーティフィケーションを飛ばせるので楽だが、現在ではこの方法は非推奨となっている。
また、細かい設定を行うことができない。
Receiverを使用したプッシュ通知の受け取りに変更してみる
具体的には、自作のReceiverで、ParseのメッセージをJSON形式で受け取る方法に変更してみる。
余談、JSONで受け取らなくても、メッセージだけを
Bundle extra = intent.getExtras();
String message = extra.getString("com.parse.Data");
として受け取ることも可能。
サイトを参考に、ParsePushBroadcastReceiverを継承したParseReceiverを作成してみる。
ParsePushBroadcastReceiverは、Parseの1.6.0あたりから新規で追加されたクラスで、このReceiverがParseのSDKの中で通知を受け取っている。
public class ParseReceiver extends ParsePushBroadcastReceiver {
//JSON型で送られてきたプッシュ通知を受け取るメソッド
public void onPushOpen(Context context, Intent intent) {
try {
//jsonから値を取り出し
Bundle extra = intent.getExtras();
String data = extra.getString("com.parse.Data");
JSONObject json = new JSONObject(data);
//JSONをパースして、欲しいデータを取り出しノーティフィケーションを発行する。
PendingIntent notificationIntent = PendingIntent.getActivity(mContext, 0, new Intent(mContext, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(mContext);
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(message);
notificationBuilder.setSmallIcon(R.drawable.ic_launcher);
notificationBuilder.setContentIntent(notificationIntent);
notificationBuilder.setAutoCancel(true);
//Wear対応
notificationBuilder.setLargeIcon(R.drawable.ic_large);
NotificationManager notificationManager = (NotificationManager)mContext.getSystemService(mContext.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
AndroidManifest.xmlにIntentFilterとパーミッションの設定を記述する。(元からParseをしようしていたのなら3つ目のReceiverのタグだけを書けばいい。)
<!--<application>〜</application>の中に記述-->
<receiver android:name="com.parse.ParseBroadcastReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver
android:name="com.parse.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="${applicationId}" />
</intent-filter>
</receiver>
<receiver
android:name="${applicationId}.ParseReceiver" android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
<permission
android:name="${applicationId}.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="${applicationId}.permission.C2D_MESSAGE" />
今回はまったところ
既存のバージョンで通知が2件発生する
前のバージョンで、PushService.setDefaultPushCallback(getApplicationContext(), MainActivity.class, R.drawable.ic_launchar);を呼んで、Push通知を発行していた場合、サーバーから送られてくるメッセージは一つでも、アプリの受け取り側で2回レシーバーのフィルターに引っかかってしまうようだ。
この対策は、先ほど実装したParseReceiverで、onPushOpenをオーバーライドするのではなく、onReceveをオーバーライドするように変更する。
これにより、今まではonReceveからonPushOpenが呼ばれて2件飛んでいたのを一件にすることができる。