简体   繁体   中英

Open specific activity when notification clicked in background

There are two types of messages in FCM (Firebase Cloud Messaging):

Display Messages: These messages trigger the onMessageReceived() callback only when your app is in foreground

Data Messages: Theses messages trigger the onMessageReceived() callback even if your app is in foreground/background/killed

When the notification is received in foreground i am able to open the specific activity on notification press but when the notification is received in background i can t handle the notification press(it launches automatically the main activity)

I did some search and found :

I added these intent-filter to my notification activity:

<activity android:name="com.mahdi.tiger.alahedclubnewtesting.activity.News_description"
            android:exported="true">
            <intent-filter>
                <action android:name="com.mahdi.tiger.alahedclubnewtesting.activity.News_description"></action>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

but it doesn t work..

I found also :

When your app is in the background, Android directs notification messages to the system tray. A user tap on the notification opens the app launcher by default.

So what should i do ? i want when the notification is received in background to handle the click and open my specific activity.

This is the code i am using:

    public class myFirebaseMessagingService extends FirebaseMessagingService {

        private static final String TAG = "FirebaseMessageService";
        Bitmap bitmap;

        /**
         * Called when message is received.
         *
         * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
         */
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            // There are two types of messages data messages and notification messages. Data messages are handled
            // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
            // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
            // is in the foreground. When the app is in the background an automatically generated notification is displayed.
            // When the user taps on the notification they are returned to the app. Messages containing both notification
            // and data payloads are treated as notification messages. The Firebase console always sends notification
            // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
            //
            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());

                String title=remoteMessage.getNotification().getTitle();
                String body=remoteMessage.getNotification().getBody();
                String action=remoteMessage.getNotification().getClickAction();



                sendNotification2(title,body,action);
            }

            //The message which i send will have keys named [message, image, AnotherActivity] and corresponding values.
            //You can change as per the requirement.
            String text = remoteMessage.getData().get("title");
            //message will contain the Push Message
            String message = remoteMessage.getData().get("message");
            //imageUri will contain URL of the image to be displayed with Notification
            //If the key AnotherActivity has  value as True then when the user taps on notification, in the app AnotherActivity will be opened.
            //If the key AnotherActivity has  value as False then when the user taps on notification, in the app MainActivity will be opened.
            String TrueOrFlase = remoteMessage.getData().get("AnotherActivity");

            //To get a Bitmap image from the URL received
            sendNotification(message, text,TrueOrFlase);

        }


        /**
         * Create and show a simple notification containing the received FCM message.
         */

        private void sendNotification(String messageBody,String text, String TrueOrFalse) {
            Intent intent = new Intent(this, Slider_description.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("AnotherActivity", 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)
                    .setSmallIcon(R.mipmap.ahed_me)
                    .setContentTitle(text)
                    .setAutoCancel(true)
                    .setContentText(messageBody)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);

            NotificationManager notificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
        }
}

NOTE: i am using Firebase console to send notification.

Thanks a lot.

After a bit of testing I found this.

https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java

The interesting part for you.

There are two types of messages data messages and notification messages. Data messages are handled here in onMessageReceived whether the app is in the foreground or background. Data messages are the type traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app is in the foreground. When the app is in the background an automatically generated notification is displayed. When the user taps on the notification they are returned to the app. Messages containing both notification and data payloads are treated as notification messages. The Firebase console always sends notificationmessages.

If you want full control on the notification you need to send data message. You can not use the firebase console to do it from my understanding.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM