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!

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top