extras incorretos recebidos com todas as intenções, mas o primeiro
-
19-09-2019 - |
Pergunta
Eu tenho um pequeno aplicativo que pode ser usado para definir memos para eventos futuros. O aplicativo usa um AlarmManager para definir o tempo para quando o usuário deve ser lembrado. Quando o alarme dispara, a BroadcastReceiver registra este e por sua vez inicia um serviço para notificar o usuário por meio de um brinde e uma notificação na barra de status.
Para exibir as informações corretas na notificação e torradas, algumas informações extras é passado juntamente com a intenção. A primeira vez que um lembrete está registrado, a informação recebida pelo BroadcastReceiver e passada para o serviço está correto. Mas para cada seguinte lembrete (ou seja, cada novo intenção recebido pelo BroadcastReceiver) esta informação permanece a mesma, mesmo quando o enviou informações é diferente.
Por exemplo, se o "foo" string é colocado como um extra com a primeira intenção, "foo" é corretamente extraído pelo BroadcastReceiver. Se "bar" é colocado como um extra na segunda intenção, "foo" ainda é extraído pela BroadcastReceiver.
Este é o código que registra o alarme e passa a intenção (ui-classe principal):
Intent intent = new Intent(ACTION_SET_ALARM);
intent.putExtra("desc", desc);
intent.putExtra("time", time);
intent.putExtra("dbId", dbId);
intent.putExtra("millis", millis);
PendingIntent pIntent = PendingIntent.getBroadcast(quickAlert.this, 0, intent, 0);
// Schedule the alarm!
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, millis, pIntent);
O OnReceive () - método na classe BroadcastReceiver:
@Override
public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, AlertService.class);
String desc = intent.getStringExtra("desc").equals("") ? "": ": " + intent.getStringExtra("desc");
String time = intent.getStringExtra("time");
long dbId = intent.getLongExtra("dbId", -1);
long millis = intent.getLongExtra("millis", -1);
i.putExtra("desc", desc);
i.putExtra("time", time);
i.putExtra("dbId", dbId);
i.putExtra("millis", millis);
Log.d(TAG, "AlertReceiver: " + desc + ", " + time + ", " + dbId + ", " + millis);
Toast.makeText(context, "Reminder: " + desc, Toast.LENGTH_LONG).show();
context.startService(i);
}
A intenção-filtro no manifesto:
<receiver android:name=".AlertReceiver">
<intent-filter>
<action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" />
</intent-filter>
</receiver>
Eu estive preso com isso por algum tempo agora, para ajuda é muito apreciada!
Solução
Tente adicionar FLAG_UPDATE_CURRENT
na sua PendingIntent
ao criá-la via getBroadcast()
.
Outras dicas
As respostas acima estão corretas, mas eles não têm uma explicação. É importante notar esta parte da documentação PendingIntent :
A própria PendingIntent é simplesmente uma referência a um símbolo mantido pelo sistema que descreve os dados originais usados ??para recuperá-lo. ... Se o aplicativo criar mais tarde re-recupera o mesmo tipo de PendingIntent (mesma operação, mesma ação Intenção, dados, categorias e componentes, e as mesmas bandeiras), ele receberá um PendingIntent representando o mesmo símbolo
Note que os dados "extra" é especificamente não incluído no conceito de PendingIntent-identidade!
melhor link que eu encontrei sobre este tema: http://alvinalexander.com/source-code/android/android-how-attach-extra-intent-pendingintent-notification-solution-example
Esta é a pista:
int uniqueInt = (int) (System.currentTimeMillis() & 0xfffffff);
PendingIntent.getService(context, uniqueInt, intent, 0)