Открыть конкретную активность, когда уведомление было нажато в FCM
Я работаю над приложением, в котором мне требуется показать уведомление.
Для уведомления я использую FireBase Cloud Messaging (FCM).
Я могу получить уведомление, когда приложение находится в фоновом режиме.
Но когда я нажимаю на уведомление, он перенаправляется на страницу home.java. Я хочу, чтобы он перенаправлялся на страницу Notification.java.
Итак, скажите, пожалуйста, как указать Activity in on Click of notification.
Я использую две службы:
1.) MyFirebaseMessagingService
2.) MyFirebaseInstanceIDService
Это мой пример кода для метода onMessageReceived() в классе MyFirebaseMessagingService.
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "FirebaseMessageService";
Bitmap bitmap;
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent(this, Notification.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
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)
.setLargeIcon(image)/*Notification icon image*/
.setContentTitle(messageBody)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(image))/*Notification with Image*/
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
/*
*To get a Bitmap image from the URL received
* */
public Bitmap getBitmapfromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
Ответы
Ответ 1
С помощью FCM вы можете отправлять клиентам два типа сообщений :
1. Уведомительные сообщения: иногда считается "отображением сообщений".
FCM автоматически отображает сообщение для устройств конечного пользователя от имени клиентского приложения. Уведомительные сообщения имеют предопределенный набор видимых пользователю ключей.
2. Сообщения данных:, которые обрабатываются клиентским приложением.
Клиентское приложение отвечает за обработку сообщений с данными. Сообщения данных имеют только пользовательские пары ключ-значение.
Согласно документу FCM Получать сообщения в приложении для Android
-
Уведомления доставляются, когда ваше приложение находится в фоновом режиме. В этом случае уведомление доставляется в системный трей устройств. При нажатии пользователем на уведомление по умолчанию открывается панель запуска приложения.
- Сообщения с уведомлением и полезной нагрузкой данных, как фоновые, так и передние. В этом случае уведомление доставляется на
Системный трей устройств, а данные загружаются в дополнениях о намерениях вашего лаунчера Активность.
Установите click_action
в уведомлении:
Итак, если вы хотите обработать сообщения, поступившие в фоновом режиме, вы должны отправить click_action
с сообщением.
click_action
является параметром полезной нагрузки уведомления
Если вы хотите открыть свое приложение и выполнить определенное действие, установите click_action
в полезной нагрузке уведомления и сопоставьте его с фильтром намерений в действии, которое вы хотите запустить.
Например, установите click_action
на OPEN_ACTIVITY_1
, чтобы активировать фильтр намерений, как показано ниже:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Полезная нагрузка FCM выглядит следующим образом:
{
"to":"some_device_token",
"content_available": true,
"notification": {
"title": "hello",
"body": "test message",
"click_action": "OPEN_ACTIVITY_1"
},
"data": {
"extra":"juice"
}
}
Ответ 2
Когда приложение находится в фоновом режиме, Intent должен быть доставлен в вашей деятельности запуска. Так что это открывает вашу активность Launcher. Теперь вы проверяете, есть ли данные в Intent в активности запуска, затем запускаете требуемую активность.
Ответ 3
AndroidManifest.xml
<activity android:name="YOUR_ACTIVITY">
<intent-filter>
<action android:name="com.example.yourapplication_YOUR_NOTIFICATION_NAME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
Ваш файл FirebaseMessagingService.java метод onMessageReceived:
public void onMessageReceived(RemoteMessage remoteMessage){
String title=remoteMessage.getNotification().getTitle();
String message=remoteMessage.getNotification().getBody();
String click_action=remoteMessage.getNotification().getClickAction();
Intent intent=new Intent(click_action);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this);
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(message);
notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
notificationBuilder.setAutoCancel(true);
notificationBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
Ваша облачная функция/код сервера для уведомления:
notification: {
title: "TITLE OF NOTIFICATION",
body: "NOTIFICATION MESSAGE",
sound: "default",
click_action: "com.example.myapplication_YOUR_NOTIFICATION_NAME"
}
Ответ 4
Откройте файл MyFirebaseMessagingService.java file
внутри этого файла есть метод sendNotification(), в котором вы должны указать свою деятельность, к которой нужно перейти в Intent, как показано ниже
Intent intent = new Intent(this, YourActivityName.class);
если вы отправляете несколько уведомлений и хотите переходить к различным действиям по щелчку определенного уведомления, вы можете использовать любое условное утверждение для его достижения, я предлагаю использовать переключатель, как показано ниже
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent();
switch(condition) {
case '1': intent = new Intent(this, ActivityOne.class);
break;
case '2': intent = new Intent(this, ActivityTwo.class);
break;
case '3': intent = new Intent(this, ActivityThree.class);
break;
default : intent = new Intent(this, DefaultActivity.class);
break;
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
}
Используя эту логику, вы можете открыть определенное действие, щелкнув Уведомление в FCM.
Это прекрасно работает для меня.
Спасибо