Для чого використовується "codeCode" на PendingIntent?


110

Фон:

Я використовую PendingIntent для тривог через AlarmManager.

Проблема:

Спочатку я подумав, що для того, щоб скасувати попередні, я повинен надати точний код запиту, який я раніше використовував для запуску сигналу.

Але потім я з’ясував, що я помилявся, як говорить API скасування :

Видаліть будь-які сигнали тривоги з відповідним наміром Будь-який сигнал тривоги будь-якого типу, у якого наміри відповідають даному (як визначено filterEquals (Намір)), буде скасовано.

дивлячись на " filterEquals ", документація говорить:

Визначте, чи однакові два наміри для вирішення намірів (фільтрування). Тобто, якщо їх дія, дані, тип, клас та категорії однакові. Це не порівнює зайвих даних, включених до намірів.

тому я не розумію, що таке "codeCode" для ...

Питання:

Для чого використовується "requestCode"?

Що робити, якщо я створюю декілька сигналів тривоги з тим самим "codeCode" вони перекривають один одного?


якщо ви використовуєте той же requestCode, ви отримаєте той самий PendingIntent
pskink

3
Для PendingIntent.getBroadcast (), AndroidCod, очевидно, ігнорується. Що стосується API 22, він не зробить ваш очікуваний намір унікальним. Чи для getActivity () (і, можливо, getService (), але я не тестував). stackoverflow.com/a/33203752/2301224
Бейкер

@Baker Це не вважається помилкою? Якщо це помилка, напишіть про це тут: code.google.com/p/android/isissue/list
розробник для android

1
Ну, на самому ділі, ця документація вказати Усак в requestiCode: If you truly need multiple distinct PendingIntent objects active at the same time (such as to use as two notifications that are both shown at the same time), then you will need to ensure there is something that is different about them to associate them with different PendingIntents. This may be any of the Intent attributes considered by Intent#filterEquals(Intent), or different request code integers supplied.
EIR

@Eir Правильно, тож який сенс у використанні codeCode? Де його можна використовувати?
андроїд розробник

Відповіді:


77
  1. requestCode використовується для подальшого отримання того самого екземпляра, що очікує (для скасування тощо).
  2. Так, я здогадуюсь, що тривоги переможуть один одного. Я б зберігав коди запитів унікальними.

5
встановлює код запиту таким, щоб бути унікальним, навіть у тому випадку, якщо наміри тривог сильно відрізняються (наприклад, для служби A та іншої для служби B)? Крім того, чому документація нічого не говорить про це? Чи можливо видалити всі тривоги певного типу, незалежно від того, який код запиту?
андроїд розробник

1
Ні, це не потрібно для різних намірів. І я не знаю, чому документація нічого не говорить про це, але я дізнався це, коли встановлював повторювані сигнали тривоги, а також коли використовував той самий намір.
Мінхай Арфін

2
Я говорив про PendingIntent. startActivityForResult використовує звичайний намір.
андроїд розробник

2
яка мета "startActivityForResult з PendingIntent з використанням активності проксі"? ви можете навести приклад?
андроїд розробник

3
Я згоден; документація на PendingIntent та AlarmManager загальна - погіршиться тим, що не можна програмно перелічити тривоги.
Хтось десь

33

Я просто хочу додати @Minhaj відповідь Арфіна

1- requestCode використовується для отримання того ж наміру, що очікує згодом (для скасування тощо)

2 - Так, вони будуть переохоплюватись до тих пір, поки ви вкажете той самий Одержувач у своєму намірі, який ви вказали у своєму PendingIntent

приклад:

Intent startIntent1 = new Intent(context, AlarmReceiverFirst.class);
PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, startIntent1, 0);

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

З наведеного вище прикладу вони не переможуть один одного, оскільки приймач різний (AlarmReceiverFirst та AlarmReceiverSecond)

Intent startIntent2 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, startIntent2, 0);

Intent startIntent3 = new Intent(context, AlarmReceiverSecond.class);
PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, startIntent3, 0);

З наведеного вище прикладу вони будуть перекривати один одного, оскільки приймач однаковий (AlarmReceiverSecond)


Intent startIntent4 = новий намір (контекст, AlarmReceiverSecond.class); PendingIntent pendingIntent4 = PendingIntent.getService (контекст, 0, startIntent4, 0); було б тоді добре? Я маю на увазі, чи не буде це перевизначення, оскільки він викликає getService () замість getBroadcast ()?
Дженікс

Вибачте, що задаю інше запитання, але оскільки stackoverflow не дозволяє мені написати питання без єдиного рядка коду. Чи останній аргумент таких методів PendingIntent, як getBroadcast (), не має нічого спільного з переосмисленням? Я раніше ставив 0 так, як ваш приклад код вище, але я також бачив, що багато людей ставлять певне значення опції замість 0.
Дженікс

1
@ Jenix uou використовувати AlarmReceiverSecond.classза наміром, а потім використовувати PendingIntent.getService(). Це не спрацює, оскільки AlarmReceiverSecond.classє, а BroadcastReceiverнеService
HendraWD

1
Щодо прапорів, це властивості, які ви можете встановити, будуть визначати поведінку вашого PendingIntent відповідно до наданих вами прапорів. 0 означає, що всі прапори вимкнено
HendraWD

Ах, я був дурний ха-ха. Що в світі я думав .. Я трохи розгубився в PendingIntent, і ваша відповідь була дуже корисною. І я просто хотів зробити це зрозумілішим, але тепер зрозумів, що моє запитання спочатку не мало сенсу. Дякую!
Дженікс

2

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

 PendingIntent pendingIntent =
                            PendingIntent.getActivity(this, **Some unique id for all GCMS** /* Request code */, intent,
                                    PendingIntent.FLAG_ONE_SHOT);

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

То навіщо встановлювати інший код запиту, якщо він вам не потрібен?
андроїд розробник

ОК, я докладно поясню, у мене була деяка АКТИВНІСТЬ А, мається на увазі показати питання, я передам ідентифікатор із сповіщень через наміри, а потім зробить мережевий запит на цей ідентифікатор і виберу конкретний запитання, так що ж відбувалося, коли там є більше 1 повідомлення в лотку повідомлень, а потім натискаю на будь-яке з них, я отримую ідентифікатор питання, який був у першому GCM, після зміни коду запиту на очікування на деяке унікальне значення, яке він працював. Я сподіваюся, що я дав зрозуміти, що якщо я потребую більше обговорення, я там, я також хочу дізнатися більше, дякую
JSONParser

О, ти мав на увазі, що в іншому випадку це б не працювало взагалі, правда? Вибачте за плутанину. Це питання було задано давно, і я його зовсім не пам’ятаю ...
андроїд розробник

1

одна важлива річ, requestCodeяка серйозно зашкодить вашій програмі - це використання віджетів. після перезавантаження телефону віджети не працюватимуть, якщо requestCodeвони однакові. це означає, що pendingIndentви встановите на remoteViewsсвоєму віджеті повинен бути встановлений унікальний requestCode, як правило, widgetId, що супроводжує номер.


0

Насправді в документації чітко зазначено, для чого використовується код запиту:

Якщо вам справді потрібні кілька різних об'єктів PendingIntent, що діють одночасно (наприклад, використовувати два сповіщення, які обидва відображаються одночасно), вам потрібно буде переконатися, що в них є щось інше, щоб пов’язати їх з різними Відкладені інтегранти Це може бути будь-який з атрибутів Intent, розглянутих Intent # filterEquals (Intent), або різних цілих кодів запиту, що надаються getActivity (Context, int, Intent, int), getActivities (Context, int, Intent [], int), getBroadcast ( Context, int, Intent, int) або getService (Context, int, Intent, int).

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

Коли ви хочете використовувати PendingIntentоб'єкт, ви не просто створити його. Швидше за все , ви отримаєте одну з системи , використовуючи PendingIntentстатичні методи ( getActivity, getBroadcast, і getServiceт.д.). Система зберігає купу екземплярів PendingIntent і дає вам один. Який з них він вам дає, це залежить від вхідних параметрів, які ви передаєте цим методам отримання. Такими вхідними параметрами є:, Contextтобто цільовий приймач наміру, Intentвикористовуваний requestCodeта flags. Коли ви передаєте один і той же Context, той самий requestCodeі той самий намір (маючи на увазі наміри, що filterEqualsз іншим наміром), ви отримуєте той самий PendingIntentоб’єкт. Справа в тому, що система хоче мати якомога менше PendingIntentоб'єктів, тому вона прагне максимально повторно використовувати існуючі.

Наприклад, у вас є два сповіщення календаря для двох різних дат. Коли ви клацаєте на одному з них, ви хочете, щоб ваш додаток відкрився до відповідної дати цього повідомлення. У цьому сценарії у вас однакова Contextціль, і Intentоб'єкт, який ви проходите, відрізняється лише EXTRA_DATA (який визначає дату, яка повинна бути відкритою). Якщо ви надаєте те саме requestCodeпри отриманні PendingIntentоб'єкта, тоді ви закінчитеся з тим самим PendingIntentоб'єктом. Отже, створюючи друге повідомлення, ви заміните старий Intentоб'єкт на новий EXTRA_DATA і в кінцевому підсумку вийдете два повідомлення, що вказують на одну і ту ж дату.

Якщо ви хочете мати два різних PendingIntentоб'єкти, як слід у цьому сценарії, вам слід вказати інший requestCodeпри отриманні PendingIntentоб'єкта.


Але, як я вже згадував, для скасування сигналів тривоги ви не можете використовувати лише codeCode. Це нічого не означає для цього. Вам потрібно буде ввести додаткові дані, щоб розмежувати їх. Я не пам’ятаю, але я думаю, ви навіть можете використовувати один і той же код запиту для декількох сигналів тривоги.
андроїд розробник

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