Firebase Cloud Messagingを使ってみる 後編
前回はFirebaseSDKを設定し、実際にPush通知を受信するところまで実施しました。
今回はメッセージをアプリでハンドリングする方法についてみていきます。
FirebaseMessagingServiceを設定する
受信したメッセージをアプリで処理するためにはFIrebaseMessagingServiceを継承したクラスを定義し、onReceiveMessageをオーバーライドする必要があります。
受信から10秒間の処理は実行が保証されますが、10秒以上かかる処理の場合、実行が保証されないため、FirebaseJobSchedulerを使用してください。
@Override public void onMessageReceived(RemoteMessage remoteMessage) { Log.d(TAG, "From: " + remoteMessage.getFrom()); if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); if (/* 長い処理が必要な場合 */ true) { // 10秒以上かかる処理の場合 Firebase Job Dispatcherを使用する scheduleJob(); } else { // 10秒未満の場合はすぐに処理する handleNow(); } } // Notificationメッセージの場合 if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } }
メッセージの種類
- 通知メッセージ
受信すると自動的にNotificationを表示してくれます。 - データメッセージ
受信したメッセージをアプリにて処理します。 - 両方が含まれるメッセージ
通知とデータが両方含まれたメッセージで、基本は通知メッセージと同様の動作となります。
詳しくは以下を確認ください。
About FCM Messages | Firebase
フォアグラウンドとバックグラウンドの動作の違い
ここではメッセージの送信にNotifications Composerを使用しています。
メッセージの種別は、通知とデータ両方が含まれるメッセージについて記載します。
フォアグラウンドでの受信 FIrebaseMessagingService#onMessageReceivedメソッドが呼び出されます。
Notificationは自動的に表示されませんので、アプリ自身がRemoteMessageの内容から適切に処理する必要があります。 データペイロードもRemoteMessageに含まれています。バックグラウンドでの受信 FIrebaseMessagingService#onMessageReceivedメソッドが呼び出されません。 Notificationは自動的表示され、ユーザーに通知されます。
メッセージに含まれるデータペイロードは、Notificationをタッチしてアプリを開いた時のIntentに付与されます。 Activityの起動時にIntentを確認し、Notificationからの起動を判断してください。
まとめ
通知メッセージはフォアグラウンドの場合のみonMessageReceivedが呼ばれ、バックグラウンドの場合はNotificationが自動的に表示され、起動Intentにデータペイロードが付与される。
データメッセージの場合は、フォアグラウンド、バックグラウンド関係なくonMessageReceivedが呼ばれ、Notificationの表示はアプリ自身が行う。
両方が含まれる場合は通知メッセージと同じ動作となる。
参考
Set Up a Firebase Cloud Messaging Client App on Android | Firebase Receive Messages in an Android App | Firebase