Fundo:
Estou usando PendingIntent para alarmes via AlarmManager.
O problema:
A princípio pensei que, para cancelar os anteriores, devo fornecer o requestCode exato que usei antes para iniciar o alarme.
Mas então descobri que estava errado, como diz a API de cancelamento :
Remova todos os alarmes com um Intent correspondente. Qualquer alarme, de qualquer tipo, cujo Intent corresponda a este (conforme definido por filterEquals (Intent)), será cancelado.
olhando para " filterEquals ", a documentação diz:
Determine se duas intents são iguais para fins de resolução de intent (filtragem). Isto é, se sua ação, dados, tipo, classe e categorias são os mesmos. Isso não compara nenhum dado extra incluído nas intents.
então não entendi para que serve o "requestCode" ...
A questão:
Para que é usado "requestCode"?
E se eu criar vários alarmes com o mesmo "requestCode"? eles se sobrepõem?
fonte
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.
Respostas:
requestCode
é usado para recuperar a mesma instância de intent pendente posteriormente (para cancelamento, etc.).fonte
Eu só quero adicionar a resposta de @Minhaj Arfin
1- requestCode é usado para obter a mesma intenção pendente posteriormente (para cancelamento, etc.)
2- Sim, eles serão substituídos, desde que você especifique o mesmo Receptor para seu Intent que você especificou em seu PendingIntent
exemplo:
Do exemplo acima, eles não se substituirão porque o receptor é diferente (AlarmReceiverFirst e AlarmReceiverSecond)
Do exemplo acima, eles se substituirão, porque o receptor é o mesmo (AlarmReceiverSecond)
fonte
AlarmReceiverSecond.class
na intenção e depois usaPendingIntent.getService()
. Não funcionará, poisAlarmReceiverSecond.class
é umBroadcastReceiver
, não umService
no meu caso, quero abrir a mesma atividade com duas intents diferentes, portanto, se houver dois ou mais FCMS na bandeja, qualquer uma delas abrirá apenas a outra não, então mudei os códigos de solicitações de intents pendentes e funcionou.
fonte
uma coisa importante sobre
requestCode
isso que vai causar problemas sérios ao seu aplicativo é quando usar widgets. widgets não funcionarão após a reinicialização do telefone serequestCode
forem iguais. isso significa que o quependingIndent
você definiu noremoteViews
de seu widget deve ser definido como requestCode exclusivo, geralmente o widgetId que acompanha um número.fonte
Na verdade, a documentação afirma claramente para que o código de solicitação é usado:
Como parece que ainda não está claro, deixe-me tentar explicar:
Quando você deseja usar um
PendingIntent
objeto, não basta instanciar um. Em vez disso, você obter uma a partir do sistema usando osPendingIntent
métodos estáticos (getActivity
,getBroadcast
,getService
etc.). O sistema mantém várias instâncias PendingIntent e fornece uma. Qual ele fornece, depende dos parâmetros de entrada que você passa para esses métodos getter. Esses parâmetros de entrada são:,Context
ou seja, o receptor alvo da intenção, aIntent
usarrequestCode
eflags
. Quando você passa o mesmoContext
, o mesmorequestCode
e mesmo Intent (ou seja, um intentfilterEquals
com outro intent), você obtém o mesmoPendingIntent
objeto. A questão é que o sistema quer ter o mínimo dePendingIntent
objetos possível, então tende a reutilizar os existentes, tanto quanto possível.Por exemplo, você tem duas notificações de calendário, para duas datas diferentes. Ao clicar em um deles, você deseja que seu aplicativo seja aberto na data correspondente dessa notificação. Nesse cenário, você tem o mesmo
Context
destino, e oIntent
objeto que você está passando difere apenas em EXTRA_DATA (que especifica a data que deve ser aberta). Se você fornecer o mesmorequestCode
ao obter oPendingIntent
objeto, acabará com o mesmoPendingIntent
objeto. Assim, ao criar a segunda notificação, você irá substituir oIntent
objeto antigo pelo novo EXTRA_DATA, e ficará com duas notificações apontando para a mesma data.Se você deseja ter dois
PendingIntent
objetos diferentes , como deveria neste cenário, você deve especificar um diferenterequestCode
ao obter oPendingIntent
objeto.fonte