Намерение в уведомлении не меняется - PullRequest
0 голосов
/ 15 февраля 2019

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

Это код уведомления:

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context, CHANNEL_OUTPUT_LEVELS)
                .setSmallIcon(icon)
                .setContentTitle(title)
                .setContentText(message)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText(longmessage))
                .setContentIntent(getPendingIntent(solarEdge, reason))
                .setAutoCancel(true)
                .setPriority(NotificationCompat.PRIORITY_DEFAULT);

NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

// notificationId is a unique int for each notification that you must define
// we use the installation's ID to make sure all notifications get sent
notificationManager.notify(solarEdge.getInfo().getId(), mBuilder.build());

Метод, который создает PendingIntent is:

private PendingIntent getPendingIntent(SolarEdge solarEdge, int reason) {
    String apikey = solarEdge.getApikey();
    int installationId = solarEdge.getInfo().getId();

    Intent intent = new Intent(context, InstallationActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    intent.putExtra(EXTRA_API_KEY, apikey);
    intent.putExtra(EXTRA_INSTALLATION_ID, installationId);
    intent.putExtra(EXTRA_REASON, reason);

    return PendingIntent.getActivity(context, 0, intent, 0);
}

Проблема, с которой я столкнулся, заключается в том, что даже если я создаю другое намерение, он все равно всегда вызывает Activity с одинаковыми дополнениями (apikey и installid).Всегда требуется первый созданный.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

Известная "проблема" / quirk / design, и мы, программисты, постоянно сталкиваемся с ней.Параметр кода запроса должен иметь значение, отличное от 0, если намерение одинаковое (действие, данные или компонент одинаковы, отличаются не только дополнительные данные).

int requestCode = 1;
PendingIntent.getActivity(context, requestCode, intent, 0);

Дополнительно:

ЕслиВы хотите обновить уведомление / ожидающий намерение позже, вы можете использовать тот же код запроса.

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

Я обычно следую этому шаблону:

requestCode = 1 for the content intent.
requestCode = 2 for first action
requestCode = 3 for second action
etc
0 голосов
/ 15 февраля 2019

Принятый ответ является одним из способов решения проблемы, но это не единственный способ.

Чтобы получить уникальный PendingIntent при каждом вызове, вызов на PendingIntent.getActivity() должен обеспечить или уникальный requestCode или уникальный Intent.Чтобы сделать Intent уникальным, необходимо предоставить или уникальное ДЕЙСТВИЕ, ДАННЫЕ или КОМПОНЕНТ.Поэтому есть несколько способов решить эту проблему.

0 голосов
/ 15 февраля 2019

Кажется, что проблема вызвана аргументами, которые вы передали методу getActivity.

Попробуйте следующий код

PendingIntent.getActivity(context, <unique_value_per_every_call>, intent, 0);

Второй аргумент - requestCode, поэтомудолжен быть уникальным.

...