Notification action need to click twice to perform action

382 views Asked by At

I have notification with three different actions. i.e. Call, SMS, Snooze. But whenever notification come I click on any action then only main activity open but no action perform. but if app is open then action gets perform.

If App Open : Action will get perform and notification dismiss.
If App Not Open : App will get open, No action perform and notification will stay there.

Here is my ReminderService.java

Intent intentCall = new Intent(this, MainActivity.class);
    intentCall.setAction(Constants.NOTIFY_CALL);
    intentCall.putExtra("rowId", rowId);
    intentCall.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntentCall = PendingIntent.getActivity(this, (int)rowId, intentCall, PendingIntent.FLAG_UPDATE_CURRENT);

    //Maybe intent
    Intent intentSMS = new Intent(this, MainActivity.class);
    intentSMS.setAction(Constants.NOTIFY_SMS);
    intentSMS.putExtra("rowId", rowId);
    intentSMS.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntentSms = PendingIntent.getActivity(this, (int)rowId, intentSMS, PendingIntent.FLAG_UPDATE_CURRENT);

    Intent snoozeIntent = new Intent(this, MainActivity.class);
    snoozeIntent.setAction(Constants.NOTIFY_SNOOZE);
    snoozeIntent.putExtra("rowId", rowId);
    snoozeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
            | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent pendingIntentSnooze = PendingIntent.getActivity(this, (int)rowId, snoozeIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    //Initialize NotificationManager using Context.NOTIFICATION_SERVICE
    NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
    //Prepare Notification Builder
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this);


    if(notes.length() <= 0){
        notificationBuilder.setContentText("Do you want to call or sms to "+name);
        notificationBuilder.setStyle(new NotificationCompat.BigTextStyle()
                .bigText("Do you want to call or sms to "+name));

    } else {
        notificationBuilder.setContentText(notes);
        notificationBuilder.setStyle(new NotificationCompat.BigTextStyle()
                .bigText(notes));
    }

    notificationBuilder.setContentTitle(name);
    notificationBuilder.setSmallIcon(getNotificationIcon());
    notificationBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
    notificationBuilder.addAction(R.mipmap.ic_stat_call, "", pendingIntentCall);
    notificationBuilder.addAction(R.mipmap.ic_stat_sms, "", pendingIntentSms);
    notificationBuilder.addAction(R.mipmap.ic_stat_snooze, "", pendingIntentSnooze);
    notificationBuilder.setAutoCancel(true);        

    notificationManager.notify((int)rowId, notificationBuilder.build());  

Here is MainActivity.java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    executeNotification(intent);
}

private void executeNotification(Intent intent) {

    LogFile.appendLog(" In Execute Notification : " + intent.getExtras().getLong("rowId"));
    long rowId;
    if (intent.getExtras() != null) {
        if (intent.getExtras().getLong("rowId") > 0) {
            LogFile.appendLog("Row Id received : -" + intent.getExtras().getLong("rowId"));
            rowId = intent.getExtras().getLong("rowId");
            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.cancel((int) rowId);
            RemindersDbAdapter mDBHelper = new RemindersDbAdapter(this);
            mDBHelper.open();
            Cursor cursor = mDBHelper.fetchReminder(rowId);
            String Number = cursor.getString(cursor.getColumnIndex(RemindersDbAdapter.KEY_NUMBER));
            if (intent.getAction() != null) {
                if (intent.getAction().equalsIgnoreCase(Constants.NOTIFY_CALL)) {
                    LogFile.appendLog("executeNotification() : received notification Call time:" + " rowId : " + rowId);

                    makeReminderCall(Number);
                } else if (intent.getAction().equalsIgnoreCase(Constants.NOTIFY_SMS)) {
                    LogFile.appendLog("executeNotification() : received notification SMS :" + " rowId : " + rowId);
                    sendReminderSMS(Number);
                } else if (intent.getAction().equalsIgnoreCase(Constants.NOTIFY_SNOOZE)) {
                    LogFile.appendLog("executeNotification() : received notification SNOOZE :" + " rowId : " + rowId);
                    snoozeReminder((int) rowId);
                }
            }
        }
    }
}

So I need to click twice to perform action, one click to open app and second to perform action.

Please let me know what wrong I am doing.

1

There are 1 answers

0
David Wasser On

If the app is not running when you click on the Notification, this will start a new instance of MainActivity() and call onCreate() with the Intent, but it will not call onNewIntent(). Therefore, in onCreate() you need to check if the app was started due to clicking on a Notification (check the "extras" or the "action" in the Intent), and if so, you need to call executeNotification() in onCreate().