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.