カスタムレシーバを作成して、プッシュ通知を受信する
最後にカスタムレシーバを作成して、プッシュ通知を受信してみます。カスタムレシーバを作成しておくと、プッシュ通知を受信した時点で自由にプッシュ通知の情報を扱うことができます。
まず、AndroidManifest.xmlにカスタムレシーバの定義を追記します。
<receiver
android:name="com.example.pushsamp.MyCustomReceiver" >
<intent-filter>
<action android:name="com.example.RECEIVE_PUSH" />
</intent-filter>
</receiver>
そして、リスト8のsendPush()を再度、修正します(リスト11)。
private void sendPush() throws JSONException {
NCMBPush push = new NCMBPush();
push.setChannel("ch1");
JSONObject data = new JSONObject("{\"action\": \"com.example.RECEIVE_PUSH\", \"title\": \"test title\", \"target\": [android]}");(1)
push.setData(data);
JSONObject user = new JSONObject("{\"URL\": \"http://www.google.co.jp/\"}");
push.setUserSettingValue(user);
push.setMessage("send push!");
push.setImmediateDeliveryFlag(true);
push.sendInBackground(new SendCallback() {
@Override
public void done(NCMBException e) {
if (e != null) {
e.printStackTrace();
Toast.makeText(getApplication(),"Push登録に失敗", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplication(),"Push登録に成功", Toast.LENGTH_SHORT).show();
}
}
});
}
\"action\": \"com.example.RECEIVE_PUSH\"をJSONデータdataに追加して、カスタムレシーバのインテントフィルタに掛かるようにします(1)。
それから、BroadcastReceiverを継承するカスタムレシーバMyCustomReceiverクラスを作成します。
public class MyCustomReceiver extends BroadcastReceiver {
private static final String TAG = MyCustomReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
try {
String channel = intent.getExtras().getString("com.nifty.Channel");(1)
JSONObject json = null;
try {
json = new JSONObject(intent.getExtras().getString("com.nifty.Data"));(2)
} catch (Exception e) {
e.printStackTrace();
}
StringBuilder sb =new StringBuilder();
sb.append("channel:"+channel+"\n");
if(null != json){
Iterator<?> itr = json.keys();
while (itr.hasNext()) {
String key = (String) itr.next();
sb.append("json key:"+key+", json_data:"+json.get(key)+"\n");
}
}
Log.d(TAG, sb.toString());
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
MyCustomReceiverでは、intent.getExtras()でインテントからチャンネル(1)とJSON形式のDataを取り出し(2)、StringBuilderを使って文字列化しています。
他にも、次の表のようなパラメータ名でペイロードを取得することができます。
| パラメータ名 | 説明 | データ型 |
|---|---|---|
| com.nifty.PushId | プッシュ通知ID | 文字列 |
| com.nifty.Data | ユーザー設定値 | オブジェクト |
| com.nifty.Title | タイトル | 文字列 |
| com.nifty.Message | メッセージ | 文字列 |
| com.nifty.Channel | チャネル | 文字列 |
| com.nifty.Dialog | ダイアログ | 1(固定) |
| com.nifty.RichUrl | リッチプッシュ通知用URL | 文字列 |
JSONデータからはIterator(イテレータ)を使って、キーと値を取得しています。ログ出力を見ると、チャンネルとユーザー設定のデータが取得できていることがわかります。
カスタムレシーバを作成すれば、受信した値に柔軟に対応する処理を記述できます。
最後に
このようにNCMBを使うと、簡単にプッシュ通知をアプリに実装できます。
プッシュ通知の機能を本連載で作成したタスクタイマアプリに組み込むとすると、管理者がグループのメンバーにタスクの進捗状況を尋ねるような使い方が考えられるでしょう。

