Обрабатывать событие нажатия трех кнопок в пользовательском уведомлении в Android

У меня есть настраиваемое уведомление с тремя кнопками («ок», «отмена», «позже»). Я могу поймать событие клика только тогда, когда есть одна кнопка, но с тремя кнопками я не могу знать, какая из них нажата. Мой вопрос: «Как узнать, какая кнопка нажата?»

// I use this code in My "createNotification" function to add event to buttons
Intent intent = new Intent(Context.NOTIFICATION_SERVICE);
PendingIntent pendinghomeIntent = 
            PendingIntent.getBroadcast(getBaseContext(), 0, intent, 0);
notificationView.setOnClickPendingIntent(R.id.okButt, pendingrecentAppIntent);
notificationView.setOnClickPendingIntent(R.id.cancelButt, pendingrecentAppIntent);
notificationView.setOnClickPendingIntent(R.id.laterButt, pendingrecentAppIntent);

Я создал сервис для регистрации и отмены регистрации вещательного приемника, и это делается отлично в случае одной кнопки. С тремя кнопками, когда я нажимаю на каждую из них, происходит один и тот же результат (который реализуется в функции onReceive), но я хочу, чтобы для каждой из них был другой результат.

Пожалуйста, помогите мне, спасибо заранее


person mostafa_fci    schedule 20.02.2014    source источник


Ответы (3)


Вам нужно использовать отдельные PendingIntents (сделанные из Intents с разными действиями) для каждой кнопки. Позже в onReceive() вы просто проверяете действие входящего Intent и выполняете другой код в зависимости от этого.

person Sam    schedule 20.02.2014
comment
спасибо за ответ, и вы правы, и я уже пробовал это, но при использовании okIntent.putExtra(do_action, 1); cancelIntent.putExtra (do_action, 2); LaterIntent.putExtra (do_action, 3); и когда проверьте это в onReceive() с помощью намерения.getExtras().get(do_action).equals(1) возникает исключение NullPointerException - person mostafa_fci; 20.02.2014
comment
а как сделать Интенты с разными действиями? - person mostafa_fci; 20.02.2014

Как сказал Сэм: «Вам нужно использовать отдельные PendingIntents (созданные из намерений с разными действиями) для каждой кнопки». Я обнаружил, что должен использовать отдельные PendingIntents для каждой кнопки, но концепция «разных действий» у меня не работает. Я использовал второй параметр setOnClickPendingIntent, чтобы различать три PendingIntent с использованием FLAG_UPDATE_CURRENT для четвертого параметра. Мой код

Intent homeIntent = new Intent(Context.NOTIFICATION_SERVICE);
    Bundle yesBundle = new Bundle();            
    yesBundle.putInt("userAnswer", 1);
    homeIntent.putExtras(yesBundle);
    PendingIntent pendinghomeIntent = 
            PendingIntent.getBroadcast(getBaseContext(), 0, homeIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notificationView.setOnClickPendingIntent(R.id.homeButt, pendinghomeIntent);

    Intent recentAppIntent = new Intent(Context.NOTIFICATION_SERVICE);
    Bundle recentAppBundle = new Bundle();   
    recentAppBundle.putInt("userAnswer", 2);
    recentAppIntent.putExtras(recentAppBundle);
    PendingIntent pendingrecentAppIntent = 
            PendingIntent.getBroadcast(getBaseContext(), 1, recentAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notificationView.setOnClickPendingIntent(R.id.recentAppButt, pendingrecentAppIntent);

    Intent settingsIntent = new Intent(Context.NOTIFICATION_SERVICE);
    Bundle settingsBundle = new Bundle();            
    settingsBundle.putInt("userAnswer", 3);
    settingsIntent.putExtras(settingsBundle);
    PendingIntent pendingsettingsIntent = 
            PendingIntent.getBroadcast(getBaseContext(), 2, settingsIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notificationView.setOnClickPendingIntent(R.id.settingsButt, pendingsettingsIntent);
    notificationManager.notify(1, notification);

и код onReceive()

public void onReceive(Context context, Intent intent) {
        Bundle answerBundle = intent.getExtras();
        int userAnswer = answerBundle.getInt("userAnswer");
        if(userAnswer == 1) {
            Log.v("shuffTest","Pressed Home");
        }else if(userAnswer == 2) {
            Log.v("shuffTest","Pressed Recent App");
        }else if(userAnswer == 3) {
            Log.v("shuffTest","Pressed Settings");
        }
    }
person mostafa_fci    schedule 20.02.2014
comment
Я предполагаю, что представление уведомлений - это ваше завышенное представление. Верно? - person Talha; 18.11.2016

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

  Intent recentApIntent = new Intent(Context.NOTIFICATION_SERVICE);
   recentApIntent.setAction("Action 1"); 
    Bundle recentAppBundle = new Bundle();   
    recentAppBundle.putInt("userAnswer", 2);
    recentAppIntent.putExtras(recentAppBundle);
    PendingIntent pendingrecentAppIntent = 
            PendingIntent.getBroadcast(getBaseContext(), 1, recentAppIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    notificationView.setOnClickPendingIntent(R.id.recentAppButt, pendingrecentAppIntent);

Аналогичным образом отделите каждое намерение действием, а при получении широковещательной передачи определите намерение.getAction() и выполните задачу.

person Neha Rathore    schedule 16.03.2018