Anto
Anto

Reputation: 907

Wrong activity when click a notification (PendingIntent)

I implemented a notification service in my android app (FirebaseMessagingService). When I click a notification, and the app is closed, the wrong activity is opened. If the notification arrives while the app is open (foreground, background), the activity that is opened is correct.

In the following code, the splash activity (first activity of the project) is opened instead of IntroNoti.class. This is the code of my FireBaseMessagingService class

public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "FCM Service";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO: Handle FCM messages here.
    // If the application is in the foreground handle both data and notification messages here.
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated.
    //Log.d(TAG, "From: " + remoteMessage.getFrom());
    //Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
    Globals.messageIn = true;
    sendNotification(remoteMessage);
}

private void sendNotification(RemoteMessage remoteMessage) {

    //Intent intent = new Intent(this, Login.class);
    Intent intent = new Intent(this, IntroNoti.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_CANCEL_CURRENT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    int icon = Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ? R.drawable.ic_launcher: R.mipmap.ic_launcher;
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(icon)
            .setContentTitle(remoteMessage.getNotification().getTitle())
            .setContentText(remoteMessage.getNotification().getBody())
            .setContentText("CIAO CIAO")
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

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

Upvotes: 0

Views: 246

Answers (2)

SUBHA DAS
SUBHA DAS

Reputation: 11

Use PendingIntent.FLAG_UPDATE_CURRENT flag with pending intent . It's work for me.

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplication(), CHANNEL_ID)
                .setSmallIcon(R.drawable.logo)
                .setContentTitle(title)
                .setPriority(NotificationCompat.PRIORITY_HIGH)
                .setCategory(NotificationCompat.CATEGORY_CALL)
                .setContentIntent(getPendingIntent())
                .setAutoCancel(true);

private PendingIntent getPendingIntent() {
    Intent intent = new Intent(getApplication(), ConversationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    return PendingIntent.getActivity(getApplication(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}

Upvotes: 0

Anto
Anto

Reputation: 907

Thanks to the advice of @Eugen Pechanec I added this instruction in my MainActivity. The "messageid" property is only valued when the app is opened by the notification. Thank you all!

if (getIntent() != null && getIntent().getExtras() != null && getIntent().getExtras().size() > 0) {
        Log.d(TAG, "Received extras in onCreate()");
        Bundle extras = getIntent().getExtras();
        if (!extras.getString("messageid","").isEmpty()) {
            Globals.fromNotification = true;
        }

    }

Upvotes: 1

Related Questions