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


##今回やること##

- 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](http://qiita.com/t-ohtake/items/b7a472cd1629266a4544)
[参考サイト2](http://qiita.com/kyosuke25/items/8f0e536a1b761b53bbbc)
[参考サイト3](http://qiita.com/t-ohtake/items/779be9b4e53d78375497)

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


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