LoginSignup
12
13

More than 5 years have passed since last update.

Parseを使用したプッシュ通知をAndroidWear対応させるためにカスタマイズしてみた

Posted at

今回やること

  • Parseを使用し、今までdefaultのプッシュ通知を送っていたものを、Receiverを使った受け取りに変更する。
  • AndroidWear対応として、NotificationにLargeIconを設定する

Parseでのプッシュ通知について

Parseの現状のメッセージの受け取り方では、メッセージを押した時に起動するアクティビティと、その小さなアイコンしか指定できない。
今回AndroidWearに対応させるためには、もっと細かくノーティフィケーション設定する必要がある!

現状:アプリの最初の登録などでsetDefaultPushCallbackを呼び、プッシュ通知を受け取れるように設定している。

SampleActivity.java
PushService.setDefaultPushCallback(getApplicationContext(), MainActivity.class, R.drawable.ic_launchar);

これだけで、アイコン付きの標準のノーティフィケーションを飛ばせるので楽だが、現在ではこの方法は非推奨となっている。
また、細かい設定を行うことができない。

Receiverを使用したプッシュ通知の受け取りに変更してみる

具体的には、自作のReceiverで、ParseのメッセージをJSON形式で受け取る方法に変更してみる。

余談、JSONで受け取らなくても、メッセージだけを

ParseReceiver.java:メッセージ受け取り部分
Bundle extra = intent.getExtras();
String message = extra.getString("com.parse.Data");

として受け取ることも可能。

サイトを参考に、ParsePushBroadcastReceiverを継承したParseReceiverを作成してみる。
ParsePushBroadcastReceiverは、Parseの1.6.0あたりから新規で追加されたクラスで、このReceiverがParseのSDKの中で通知を受け取っている。

ParseReceiver.java
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のタグだけを書けばいい。)

AndroidManifest.xml
<!--<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>
AndroidManifest.xml
<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" />

参考サイト1
参考サイト2
参考サイト3

今回はまったところ

既存のバージョンで通知が2件発生する

 前のバージョンで、PushService.setDefaultPushCallback(getApplicationContext(), MainActivity.class, R.drawable.ic_launchar);を呼んで、Push通知を発行していた場合、サーバーから送られてくるメッセージは一つでも、アプリの受け取り側で2回レシーバーのフィルターに引っかかってしまうようだ。
この対策は、先ほど実装したParseReceiverで、onPushOpenをオーバーライドするのではなく、onReceveをオーバーライドするように変更する。
 これにより、今まではonReceveからonPushOpenが呼ばれて2件飛んでいたのを一件にすることができる。

これでParseからのプッシュ通知も自由にカスタマイズできます!!!Android4.1以降、Notificationが大幅に強化されたので、ぜひカスタマイズしてみてください!

12
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
13