【mBaaS】プッシュ通知のメッセージを改行する【Android】

mBaaSのプッシュ通知を利用した時、メッセージに入れた改行がiOSではそのまま反映されますが、Androidの場合は改行が無視されて表示されてしまいます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/184715/6582d058-fcf2-56f0-078a-e982fe06ffe1.png" width=50%>

しかし、受け取ったプッシュ通知の情報には、改行のところが「\n」として保持されているので、この情報をもとにNotificationのInboxStyleを使って複数行の表示に変換します。

## 実装

新しくクラスを作成し、SDKの既存のNCMBGcmListenerServiceを継承します。
InboxStyleでメッセージを変更している部分以外は元のクラスとほぼ同じです。

```java:CustomGcmListenerService.java
public class CustomGcmListenerService extends NCMBGcmListenerService {
	@Override
	public void onMessageReceived(String from, Bundle data) {

        if ((!data.containsKey("message")) && (!data.containsKey("title"))) {
            return;
        }

        // 親Serveiceからプッシュ通知情報を取得
        NotificationCompat.Builder notificationBuilder = notificationSettings(data);

        // ---------ここからInboxStyleで表示を改変---------

        // InboxStyle:複数行のテキストを表示
        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(notificationBuilder);

        // タイトル（そのまま）
        if(null != data.getString("title")) {
            String title = data.getString("title");
            inboxStyle.setBigContentTitle(title);
        }

        // メッセージ（InboxStyleを利用して改行）
        if(null != data.getString("message")) {
            String message = data.getString("message");

            // 改行文字列をsplitで分割
            String[] messageArray = message.split("\n");

            // 分割された文字列を行として追加
            for (int i=0; i < messageArray.length; i++) {
                inboxStyle.addLine(messageArray[i]);
            }
        }

        // ---------ここまでInboxStyleで表示を改変---------

        /*
         * 通知重複設定
         * 0:常に最新の通知のみ表示
         * 1:最新以外の通知も複数表示
         */
        ApplicationInfo appInfo = null;
        try {
            appInfo = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
        } catch (PackageManager.NameNotFoundException e) {
            throw new IllegalArgumentException(e);
        }
        boolean containsKey = appInfo.metaData.containsKey("notificationOverlap");
        int overlap = appInfo.metaData.getInt("notificationOverlap");

        //デフォルト複数表示
        int notificationId = new Random().nextInt();

        if (overlap == 0 && containsKey) {
            //最新のみ表示
            notificationId = 0;
        }

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(notificationId, inboxStyle.build());

	}
}
```

またマニフェストも新しく作成したサービスを宣言します。

```xml:AndroidManifest.xml
<!--
<service
    android:name="com.nifty.cloud.mb.core.NCMBGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>
-->

<service
    android:name="パッケージ名.CustomGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    </intent-filter>
</service>
```

## 結果

- 作成したプッシュ通知
<img src="https://qiita-image-store.s3.amazonaws.com/0/184715/9ba7cba9-aba9-c2eb-b6eb-45dc8397e3a6.png" width=75%>

- 受け取ったプッシュ通知
<img src="https://qiita-image-store.s3.amazonaws.com/0/184715/ff99ee70-71fa-2efc-eb63-c1fa9fff39a0.png" width=50%>