Firebase Cloud Messagingを使用してプッシュ通知を送信しています。
これが私のFirebaseMessageService
です:
public class FireBaseMessageService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.e("TAG", "From: " + remoteMessage.getFrom());
Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+" : "+remoteMessage.getData().get("CardCode"));
sendNotification(remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, StartActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher_final)
.setContentTitle("Notification")
.setContentText(messageBody)
.setTicker("Test")
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
}
FirebaseInstanceServer
:
public class FirebaseInstanceService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.e("TAG", "Refreshed token: " + refreshedToken);
// TODO: Implement this method to send any registration to your app's servers.
sendRegistrationToServer(refreshedToken);
}
private void sendRegistrationToServer(String token) {
// Add custom implementation, as needed.
Log.e("TAG", "Refreshed token2: " + token);
}
}
AndroidManifest
で宣言されているもの:
<service
Android:name=".util.notifications.FireBaseMessageService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
Android:name=".util.notifications.FirebaseInstanceService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
問題は、アプリの実行中はticker
が適切に表示され、通知にはデフォルトのサウンドが表示されますが、アプリがバックグラウンドにあるか実行されていない場合、通知は音なしでticker
が表示されないことですステータスバーで。
なぜこれが起こっているのですか、どうすれば修正できますか?
FCMでは、POSTペイロードをhttps://fcm.googleapis.com/fcm/send
。そのペイロードでは、data
またはnotification
キー、あるいはその両方を指定できます。
ペイロードにdata
キーのみが含まれている場合、アプリはすべてのプッシュメッセージ自体を処理します。例えば。それらはすべてonMessageReceived
ハンドラーに配信されます。
ペイロードにnotification
キーが含まれる場合、アプリがアクティブ/フォアグラウンドにある場合、アプリはプッシュメッセージonlyのみを処理します。そうでない場合(つまり、バックグラウンドにあるか、完全に閉じている場合)、FCMはnotification
キーペイロードに入れた値を使用して通知を表示します。
コンソール(Firebaseコンソールなど)から送信される通知には、notification
キーが常に含まれていることに注意してください。
FCMメッセージを自分で処理したいので、通知をもう少しカスタマイズすることができます。したがって、POSTにnotification
キーを含めない方が良いでしょうすべてのプッシュメッセージはonMessageReceived
に配信されます。
詳細については、こちらをご覧ください。
高度なメッセージングオプション
ダウンストリームメッセージの構文
2週間かけて、アプリケーションがバックグラウンドにあり、可能な限り奇妙なデータメッセージを受信できなくなった理由を理解するために、Android-Studio 2.1.2が問題であるという結論に達しました!