2009-10-04 9 views
9

Ho una piccola applicazione che può essere utilizzata per impostare promemoria per eventi futuri. L'app utilizza un AlarmManager per impostare il momento in cui l'utente deve essere ricordato. Quando l'allarme si attiva, un BroadcastReceiver lo registra e, a sua volta, avvia un servizio per avvisare l'utente tramite un brindisi e una notifica nella barra di stato.Extra non corretti ricevuti a tutti gli effetti ma il primo

Per visualizzare le informazioni corrette nella notifica e brindare, alcune informazioni aggiuntive vengono trasmesse insieme all'intenzione. La prima volta che viene registrato un promemoria, le informazioni ricevute da BroadcastReceiver e trasmesse al servizio sono corrette. Ma per ogni seguente promemoria (vale a dire ogni nuovo intento ricevuto dal BroadcastReceiver) questa informazione rimane la stessa anche quando l'informazione inviata è diversa.

Ad esempio, se la stringa "pippo" viene inserita come extra con il primo intento, "foo" viene estratto correttamente da BroadcastReceiver. Se "bar" viene inserito come extra nel secondo intent, "foo" viene ancora estratto da BroadcastReceiver.

Questo è il codice che registra l'allarme e passa l'intento (principale ui classe):

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); 

L'OnReceive() - metodo della 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); 
} 

L'intento -filter nel manifest:

<receiver android:name=".AlertReceiver"> 
     <intent-filter> 
      <action android:name="com.aspartame.quickAlert.ACTION_SET_ALARM" /> 
     </intent-filter> 
    </receiver> 

Sono stato bloccato con questo per qualche tempo ora, quindi l'aiuto è molto molto apprezzato!

risposta

8

Le risposte sopra sono corrette, ma mancano di una spiegazione. Vale la pena notare questa parte del PendingIntent documentation:

Un PendingIntent sé è semplicemente un riferimento a un token mantenuto dal sistema che descrive i dati originali utilizzati per recuperarla. ... Se l'applicazione di creazione in seguito ri-recupera lo stesso tipo di PendingIntent (stessa operazione, stessa azione intenti, i dati, le categorie e componenti, e le stesse bandiere), riceverà un PendingIntent che rappresenta lo stesso motivo

Nota che i dati "extra" sono specificatamente non inclusi nel concetto di PendingIntent-identity!