Уведомление о действии нужно дважды щелкнуть, чтобы выполнить действие

У меня есть уведомление с тремя различными действиями. т.е. звони, смс, откладывай. Но всякий раз, когда приходит уведомление, я нажимаю на любое действие, тогда открываются только основные действия, но никакие действия не выполняются. но если приложение открыто, то действие выполняется.

Если приложение открыто: действие будет выполнено, а уведомление отклонено.
Если приложение не открыто: приложение откроется, никакие действия не будут выполнены, и уведомление останется там.

Вот мой 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());  

Вот 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);
                }
            }
        }
    }
}

Поэтому мне нужно дважды щелкнуть, чтобы выполнить действие, один щелчок, чтобы открыть приложение, и второй, чтобы выполнить действие.

Пожалуйста, дайте мне знать, что я делаю неправильно.

1 ответ

Если приложение не работает, когда вы нажимаете на Notification, это запустит новый экземпляр MainActivity() и позвонить onCreate() с Intent, но это не позову onNewIntent(), Поэтому в onCreate() вам нужно проверить, если приложение было запущено из-за нажатия на Notification (отметьте "дополнительные" или "действие" в Intent), и если это так, вам нужно позвонить executeNotification() в onCreate(),

Другие вопросы по тегам