android очікує на вирішення проблеми із сповіщенням


74

У моєму додатку відбувається тривога, і він запускає сповіщення, яке потім при натисканні запускає діяльність. Проблема полягає в тому, що коли я створюю більше одного будильника, тоді активність, що запускається із сповіщення, отримує ті самі додаткові можливості, що і перша. Я думаю, що проблема полягає або в намірі, який я вклав у намір, що очікує, або в самому намірі, що очікує. Я думаю, що мені, можливо, доведеться поставити прапор на одному з них, але я не знаю, який саме.

Intent showIntent =new Intent(context, notificationreceiver.class);
    showIntent.putExtra("details", alarmname);

PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
        showIntent, 0); 

    notification.setLatestEventInfo(context, "The event is imminent",
            alarmname, contentIntent);

І одержувач повідомлення

Bundle b = getIntent().getExtras();
    String eventname = b.getString("details");
    details.setText(eventname);

Додаткові "деталі" однакові для кожного наступного разу, коли відбувається сповіщення, замість того, щоб мати різне значення. Поки я не встановив наміри, я впевнений, що правильне значення переходить до "деталей", тому проблема полягає в отриманні першого наміру кожного разу, коли я натискаю будь-яке повідомлення. Як я можу змусити його запустити правильні наміри? Сподіваюся, я був настільки зрозумілим, наскільки міг. Дякую!


Те, що я зробив, це те, що я використовую унікальний уведомлениеId для відстеження статусів (сповіщення у рядку стану), я використовую ту саму змінну, щоб перейти до свого PendingIntent, що робить його унікальним.

Відповіді:


71

Проблема полягає в тому, що коли я створюю більше одного будильника, тоді активність, що запускається із сповіщення, отримує ті самі додаткові можливості, що і перша.

Правильно.

Як я можу змусити його запустити правильні наміри?

Це залежить від того, чи є у вас дві сигналізації, які будуть зареєстровані одночасно, чи ні.

Якщо ні, ви можете використовувати FLAG_ONE_SHOTабо один з інших PendingIntentпрапорів, щоб отримати ваш другийPendingIntent використовував новіші додаткові засоби.

Якщо, однак, у вас буде зареєстровано відразу два будильники з різними Intentдодатковими послугами, вам потрібно буде зробити два Intentsістотно різними, такими, що filterEquals()повертаються falseпри порівнянні двох. Наприклад, ви можете зателефонувати setData()або setAction()вказати різні значення для кожного Intent.


2
Людина дуже дякує за допомогу. Оскільки існує можливість об’єднання будильників і наявності на панелі сповіщень більше одного повідомлення, я використав прапор FLAG_UPDATE_CURRENT для очікуваного наміру. Але справжня угода була такою, як ви сказали setAction щодо наміру з назвою тривоги, і тепер він міг знати, які наміри різні і які однакові. Знову дякую!
spagi

2
setAction працював і у мене. Мені просто цікаво, чому офіційний SDK про це не згадує.
Роман Ройтер

setAction працює, завдяки TON. Використання setAction допомогло мені розрізнити всі pendingIntents, просто приголомшливо!
Сохам

використання setAction для встановлення різних дій для кожного вмісту Намір був для мене ключовим. Дуже дякую!
Крістіан Гарсія,

2
Ви також можете використовувати інший код запиту під час створення очікуваних намірів, з хешем, це досить зручно і, можливо, чистіше, ніж використання setData
Snicolas

121

Я вирішив цю проблему шляхом призначення унікального requestCode, коли ви отримуєте PendingIntent:

PendingIntent.getActivity(context, requestCode, showIntent, 0); 

Роблячи це, ви реєструєте в системі різні / унікальні екземпляри намірів. Порада: Хорошим способом зробити requestCode унікальним буде передача йому поточного системного часу.

int requestID = (int) System.currentTimeMillis();

9
requestCode справді ще нічим не використовується, але робить наміри унікальними, що зупиняє їх перезапис! Відмінна робота u-ramos!
Кітте,

1
Навіть якщо TaskStackBuilderвикористовується, ми маємо там метод. Тут getPendingIntent(int requestCode, int flags)цей ідентифікатор запиту можна передати.
Абдулла Шоайб

3
Будьте обережні, currentTimeMillis має тип long, тому, якщо ви перейдете на int, він буде усічений. Я не знаю, наскільки ймовірно і чи це має значення, але це можна було б повторити. У цьому випадку ви можете використовувати статичне збільшене значення
djpeinado

Чудове рішення. Сьогодні я дізнався, для чого потрібен код
Bibaswann Bandyopadhyay

Дякую! Ідеальне рішення!
рукліп

0

У мене виникла ця проблема в моєму додатку, і я просто створив випадкове число, яке перевищує наміри сповіщень:

int random= new Random().nextInt();
PendingIntent resultPendingIntent =
      stackBuilder.getPendingIntent(
              random,
              PendingIntent.FLAG_UPDATE_CURRENT
      );

0

Я дотримувався рішення, наданого U-ramos, і це спрацювало для мене

int requestID = (int) System.currentTimeMillis();

PendingIntent pendingIntent = PendingIntent.getActivity(this, requestID, showIntent, 0);

-1

інше рішення:

використовуйте PendingIntent.FLAG_UPDATE_CURRENT так:

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,i, PendingIntent.FLAG_UPDATE_CURRENT);

це спрацювало для мене


2
Це не працює. Він замінює старі параметри і замінює новими
Бібасванн Бандіопадхай
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.