Проблема здесь в том, что AWS SNS отправляет то, что Google называет сообщениями с данными.
С помощью FCM вы можете отправлять два типа сообщений - уведомления и данные. Уведомления отображаются FCM автоматически, а сообщения с данными - нет. Подробнее об этом здесь: https://firebase.google.com/docs/cloud-messaging/concept-options
Сообщения с данными, поступающие из SNS, по-прежнему можно обрабатывать - даже если ваше приложение работает в фоновом режиме - путем расширения FirebaseMessagingService и переопределения его onMessageReceived
метода. Подробнее об этом здесь: https://firebase.google.com/docs/reference/android/com/google/firebase/messaging/FirebaseMessagingService.
Я предполагаю, что вы хотите, чтобы ваши сообщения AWS SNS имитировали работу с уведомлениями, а именно:
- Смотрите, как они всплывают, когда приложение работает в фоновом режиме
- Отображать текст в уведомлении
- Когда приложение активируется, вы хотите, чтобы все сообщения были удалены из ящика.
Для этого вам нужно сделать три вещи.
Во-первых - вы захотите начать отслеживание, отображается ли ваше приложение в данный момент или нет. Подробную информацию о том, как надежно обнаружить это, вы можете найти здесь: https://stackoverflow.com/a/18469643/96911
Во-вторых - вы захотите обрабатывать сообщения с данными от AWS SNS, разместив уведомление, но только когда ваше приложение работает в фоновом режиме:
public class MyFirebaseMessagingService extends FirebaseMessagingService {
static protected int id = 0;
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
if (!MyApplication.isActivityVisible()) {
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle(getString(R.string.app_name))
.setSmallIcon(R.drawable.notification_icon);
String message = remoteMessage.getData().get("default");
mBuilder.setContentText(message);
Intent resultIntent = new Intent(this, MainActivity.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationManager.notify(id ++, mBuilder.build());
}
}
}
И наконец - вы захотите удалить все уведомления из ящика, когда пользователь нажимает на одно из них. В сочетании с отслеживанием видимости, которое я связал чуть выше, активность, отвечающая на уведомления, должна иметь следующий onResume
метод:
@Override
protected void onResume() {
super.onResume();
MyApplication.activityResumed();
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationManager.cancelAll();
}
Вы давно не задавали этот вопрос, но мне было так больно разбираться в этом, что я все равно решил ответить. Я надеюсь, что это поможет вам или кому-то, кто рвет на себе волосы, пытаясь заставить эту штуку работать (потому что заставить работать iOS было проще простого, черт возьми).
person
Ivan Karpan
schedule
06.09.2017