简体   繁体   中英

Notification action need to click twice to perform action

I have notification with three different actions. ie 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.

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() .

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