FLAG_CANCEL_CURRENT или FLAG_UPDATE_CURRENT

Мое приложение устанавливает повторяющийся будильник при взаимодействии с пользователем, он может изменить интервал времени, установленный для трансляции с помощью диспетчера будильников.
Дополнительных возможностей не так уж много.
В этом случае флаг обновления или отмены лучше? ?

Спасибо


person Dory    schedule 25.12.2012    source источник
comment
Что означает фраза «Не так уж много дополнений»? Пользуетесь экстра или нет?   -  person Nikolay Elenkov    schedule 26.12.2012
comment
нет, я не использую экстра..   -  person Dory    schedule 26.12.2012
comment
Имейте в виду, что у Samsung Lollipop возникают проблемы при использовании FLAG_CANCEL_CURRENT. Относится к stackoverflow.com/questions/29344971/   -  person Elye    schedule 28.01.2016


Ответы (2)


Никогда не используйте FLAG_CANCEL_CURRENT с PendingIntent, которые вы используете при настройке сигналов тревоги. Если вы хотите перенести будильник на другое время, вам вообще не нужен флаг; просто создайте дубликат PendingIntent с нулевым флагом, а затем используйте его для set() будильника: это неявно отменит существующий будильник, а затем установит его на новое указанное время. Однако если вы использовали FLAG_CANCEL_CURRENT при создании нового PendingIntent, это нарушает способность диспетчера аварийных сигналов распознавать, что это «то же самое», что и теперь отмененный PendingIntent, и вы получаете старый, висящий без дела, недоставленный и занимающий память. и ЦП. Я видел, как приложения с этой ошибкой накапливали буквально сотни устаревших предупреждений в системе, чего было достаточно, чтобы стать заметным ударом по производительности и использованию памяти.

Если вы просто хотите изменить дополнительные функции без фактического изменения расписания существующего будильника, для этого предназначен FLAG_UPDATE_CURRENT. Если вы хотите изменить расписание, вообще не используйте никаких флагов.

person ctate    schedule 07.10.2016
comment
Ваш ответ звучит противоположно статусу документации Android о FLAG_CANCEL_CURRENT. У вас есть ссылки на этот ответ? В настоящее время я сталкиваюсь с проблемой, когда я подозреваю, что FLAG_UPDATE_CURRENT не обновляет намерение должным образом, из-за чего я получаю неожиданное поведение. Я хочу изменить его, чтобы использовать FLAG_CANCEL_CURRENT, и тогда я увидел этот ответ. - person Varun Gupta; 20.05.2018
comment
Что вы читаете, что звучит противоречиво? d.android.com говорит, что FLAG_CANCEL_CURRENT гарантирует, что только сущности, получившие новые данные, смогут его запустить — старый PendingIntent недействителен, будет работать только новый, а .equals() для двух возвращает false. Если у вас есть проблемы с тем, что FLAG_UPDATE_CURRENT не меняет дополнительные функции, это отдельная семантика. - person ctate; 22.05.2018
comment
Я нашел ваш комментарий об установке флагов на 0 противоречивым. Вы написали, что если флаги установлены на 0, то PendingIntent будет отменено неявно, но если флаги установлены на FLAG_CANCEL_CURRENT, то старый будет висеть недоставленным. Я написал небольшой тест, в котором создал два PendingIntent с одним и тем же requestCode. Когда я установил флаги на 0, предыдущий PendingIntent все еще был действителен, когда я вызывал для него send. Когда я установил флаги на FLAG_CANCEL_CURRENT, то предыдущее намерение было отменено, и я не смог его отправить. - person Varun Gupta; 22.05.2018
comment
Мне жаль; Я не совсем понимаю. Я написал, что это неявно отменит существующий сигнал тревоги — он отменит сигнал тревоги, а не PendingIntent. То, что вы описываете, увидев, что после использования FLAG_CANCEL_CURRENT предыдущий экземпляр PendingIntent больше нельзя использовать, именно поэтому я говорю, что вы не должны использовать этот флаг с PendingIntent, связанными с сигналами тревоги. - person ctate; 24.05.2018

Если вы не используете дополнительные функции, вам не нужно указывать ни один из этих флагов. Они только изменяют то, как системы обрабатывают дополнительные элементы с помощью PendingIntent: заменяют те, которые находятся в текущем сопоставлении (кэшируются системой PendingIntent), или отменяют его и создают новый. Подробности см. в документации: http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

person Nikolay Elenkov    schedule 26.12.2012
comment
Поскольку ему не нужен CANCEL, тогда FLAG_UPDATE_CURRENT - это путь, иначе возникают ненужные накладные расходы на создание нового объекта. - person Mr_and_Mrs_D; 11.05.2013
comment
Кроме того, использование CANCEL может привести к PendingIntent.CanceledException - person Mr_and_Mrs_D; 19.05.2013
comment
Приводит ли CANCEL_CURRENT к удалению дополнений из-под действия, содержащего намерение? - person Eric Woodruff; 22.03.2014