HMSのプッシュ通知の受信方法とAndroidのプッシュ通知の表示方法の説明

# HMSのプッシュ通知の種類
HMSのプッシュ通知を送るときに、Notification MessageまたはData Messageを選ぶことができます。
Notification Messageで送る場合、HMS Coreが受信処理をするので、ユーザーが受信処理を実装しなくても大丈夫です。
Data Messageで送る場合、ユーザーは受信処理を実装する必要があります。
そのため、Data Messageのほうが実装の難易度が高いです。

![image.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/d3688653-53d3-1207-dbfe-886d833492a1.jpeg)

# Data Messageの受信処理の実装方法

### 1. [HmsMessageService](https://developer.huawei.com/consumer/jp/doc/development/HMS-References/push-HmsMessageService-cls)を継承するクラスを作成

```kotlin:YourHmsMessageService.kt
class MainService: HmsMessageService() {
}
```

マニュフェストにサービスを追加することも忘れずに！

```xml:AndroidManifest.xml
<service
      android:name=".YourHmsMessageService"
      android:exported="false">
      <intent-filter>
            <action android:name="com.huawei.push.action.MESSAGING_EVENT" />
      </intent-filter>
</service>
```

### 2. onMessageReceivedをオーバーライド

```kotlin:YourHmsMessageService.kt
class MainService: HmsMessageService() {
    override fun onMessageReceived(message: RemoteMessage?) {
        super.onMessageReceived(message)
        message?.let {
            val jsonData = JSONObject(it.data)
            // ここで通知を出す
        }
    }
}
```

### 3. messageを解析

次のようなData Messageを送るとします。

![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/06fc3244-2e35-6cf1-5d01-c9ae333dcb65.png)

これを送ったら、Androidでは次のように受信します。

![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/46e49d0b-8979-2060-a851-35495121da18.png)

Data MessageをJSONで処理できます。
残りはデータを通知に出すだけです。

# Androidのプッシュ通知の表示方法
HMS端末のOSバージョンは低くてもAndroid 9.0以上なので、通知を出すときに通知チャンネルが必須です。
次はAndroidのプッシュ通知を表示するサンプルです。

```kotlin:YourHmsMessageService.kt
private fun createNotification(context: Context, jsonObject: JSONObject) {
    val notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager? ?: return

    // 通知クリック後に開くActivityを定義する
    val pendingIntent = PendingIntent.getActivity(
        context,
        jsonObject.optInt("id", 0),
        Intent(context, YourActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
        },
        PENDING_INTENT_FLAG
    )

    // 通知に表示する内容を設定する
    val builder = NotificationCompat.Builder(context, CHANNEL_ID)
        // 通知アイコン
        .setSmallIcon(android.R.mipmap.sym_def_app_icon)
        // 通知タイトル
        .setContentTitle(jsonObject.optString("title"))
        // 通知本文
        .setContentText(jsonObject.optString("message"))
        // 通知の優先度やサウンドを設定するが、Android 8.0以上の場合は通知チャンネルを使うので、Android 7.1までしかこの設定が効かない
        // https://developer.android.com/training/notify-user/channels
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        // 先ほど定義したpendingIntentをセットする
        .setContentIntent(pendingIntent)
        // 通知クリック後に通知を消す
        .setAutoCancel(true)

    // Android 8.0以上の場合、通知チャンネルが必要
    // HMS端末のAndroidバージョンは9.0以上なので、通知チャンネルは必須
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            CHANNEL_ID,
            CHANNEL_NAME,
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = CHANNEL_DESCRIPTION

            // バッジを表示する
            setShowBadge(true)

            // バイブレーションを有効にする
            enableVibration(true)

            // サウンドを有効にし、デフォルトのサウンドをセットする
            setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), null)

            // ロックスクリーンに通知を表示する
            // VISIBILITY_PRIVATE : Show this notification on all lockscreens, but conceal sensitive or private information on secure lockscreens.
            // VISIBILITY_PUBLIC : Show this notification in its entirety on all lockscreens.
            // VISIBILITY_SECRET : Do not reveal any part of this notification on a secure lockscreen.
            lockscreenVisibility = Notification.VISIBILITY_PUBLIC
        }

        // 通知チャンネルを作る
        notificationManager.createNotificationChannel(channel)
    }

    // 最後は設定した
    notificationManager.notify(jsonObject.optInt(KEY_ID, 0), builder.build())
}
```

上記のサンプルを動かすと、通知チャンネルが作成され、その通知チャンネルで通知が出されます。

<img width="400" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/d42d1630-5eba-94be-3c07-505dd1be4114.png"><img width="400" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/967f6f96-c8a7-4743-6621-fd37deda12be.png">

通知も表示できます。

<img width="400" alt="image1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/704548/2ab89346-e3c5-3649-b37e-77cfe0e4c2ef.png">



# GitHub
* [https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PushDemo](https://github.com/Rei2020GitHub/MyPublicProject/tree/master/PushDemo)


# 参考
* HMS：[https://developer.huawei.com/consumer/jp/](https://developer.huawei.com/consumer/jp/)
* HMS Push Kitの紹介：[https://developer.huawei.com/consumer/jp/hms/huawei-pushkit](https://developer.huawei.com/consumer/jp/hms/huawei-pushkit)
* HMS Push Kitのドキュメント：[https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides-V5/android-dev-process-0000001050263396-V5](https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides-V5/android-dev-process-0000001050263396-V5)
* Huawei Developers：[https://forums.developer.huawei.com/forumPortal/en/home](https://forums.developer.huawei.com/forumPortal/en/home)
* Facebook Huawei Developersグループ：[https://www.facebook.com/Huaweidevs/](https://www.facebook.com/Huaweidevs/)