Search code examples
androidnotificationspush-notificationonnewintent

Android OnNewIntent not called


I saw several approaches and I tried everything but couldnt make it work.I dont know why it is so complicated, in the docs it looks so easy! I want to trigger the OnNewIntent with a notification (the user clicks on it in the notification bar).

Currently I have set my Activity as singleTop

<activity
    android:name="-.-.-.MainMenuActivity"
    android:launchMode="singleTop"
    android:screenOrientation="portrait" >
</activity>

This is the code where I create the Notification:

public void showNotification(String text, String componentId){
    NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.logo)
            .setContentTitle("Title")   
            .setAutoCancel(true)
            .setContentText(text);

    // Creates an explicit intent for an Activity in your app
    Intent resultIntent = new Intent(this, MainMenuActivity.class);
    if(!componentId.equalsIgnoreCase("")){                         
        resultIntent.putExtra("componentId", componentId);
    }   
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0);
    mBuilder.setFullScreenIntent(resultPendingIntent, false);
    mBuilder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager =
        (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    // mId allows you to update the notification later on.
    mNotificationManager.notify(0, mBuilder.build());
}

This is the OnNewIntent method in my MainMenuActivity:

@Override
protected void onNewIntent(Intent intent) {
    // TODO Auto-generated method stub
    super.onNewIntent(intent);
    setIntent(intent);

    ...
}

I never get the OnNewIntent call. I dont know what I am doing wrong. I use only 2 activites in the whole app and the MainMenuActivity comes after the LoginActivity so the MainMenuActivity should always be on top of the stack anyways (I have more fragments where I replace them inside the MainMenuActivity).

Any help would be appreciated! Thank you guys.


Solution

  • Ok got it working soon after posting my question. I think the key difference in our code is that I pass the flag "PendingIntent.FLAG_UPDATE_CURRENT" to the creation/retrieval of the PendingIntent object. This post helped me figure that out.

    Notification.Builder mBuilder =
                    new Notification.Builder(context)
                    .setSmallIcon(R.drawable.notifyicon)
                    .setContentTitle(title)
                    .setContentText(extras.getString("message"))
                    .setAutoCancel(true)
                    .setOnlyAlertOnce(false)
                    .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                    .setVibrate(new long[] {0,500,250,500});
    
            if(badgeCount > 1)
                mBuilder.setNumber(badgeCount);
            // Creates an explicit intent for an Activity in your app
            Intent resultIntent = new Intent(context, SiteViewActivity.class);
            resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            resultIntent.putExtra(NOTIFY_INTENT_TYPE_KEY, alertType);
    
            PendingIntent resultPendingIntent = PendingIntent.getActivity(context, alertType, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            mBuilder.setContentIntent(resultPendingIntent);
            NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            notifyMgr.notify(alertType, mBuilder.build());