2015-04-08 13 views
14

Documentazione per PendingIntent.FLAG_NO_CREATE recita:Come funziona confrontare Android in attesa di intenti

flag che indica che se il PendingIntent descritto non esiste già, quindi è sufficiente restituire nulla, invece di crearlo.

La mia domanda: Quali criteri vengono utilizzati per confrontare PendingIntents?

Sto indovinando sotto il cofano questo flag utilizza PendingIntent.equals, ma non sono veramente sicuro di quali criteri sta usando questa funzione. Sta usando l'azione, requestCode, categorie, extra (sto indovinando no), ecc.?

Contesto:

Voglio iniziare un allarme con un intento in attesa se il mio allarme non è già configurato. In particolare, sto seguendo questo answer.

Intent i = new Intent(applicationContext, MyService.class); 
i.setAction("myAction"); 
PendingIntent pi = PendingIntent.getService(applicationContext, /*requestCode*/0, i, PendingIntent.FLAG_NO_CREATE); 
if (pi != null) { 
    AlarmManager alarmMgr = (AlarmManager)applicationContext.getSystemService(Context.AlarmService); 
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, AlarmManager.INTERVAL_HOUR, AlarmManager.INTERVAL_HOUR, pi); 
} 
+4

Bella domanda. So che non è giusto. Ma, ho usato per annullare l'allarme precedente e riavviarlo quando mai penso che fosse necessario .. Non vedo l'ora di rispondere a questa domanda. –

+0

Immagino solo il suo codice di richiesta. Non puoi accedere alla fonte per controllarla? Android Studio di solito lo mostra. – Stan

risposta

18

Per determinare se 2 PendingIntent s corrispondenza, il seguente deve essere pari:

  • Il parametro requestCode utilizzato quando il PendingIntent stata creata
  • Il Intent ACTION
  • Le Intent CATEGORIE
  • I DATI Intent
  • Il Intent MIMETYPE
  • Il Intent PACCHETTO
  • Il Intent COMPONENTE

Extra non sono presi in considerazione.

Ulteriori informazioni sono disponibili nello PendingIntent summary documentation e Intent.filterEquals().

+2

Stavo cercando ** Extra ** parte, quindi grazie! –

2

sto cercando di indovinare sotto il cofano questo flag usa PendingIntent.equals, ma Io non sono davvero sicuro di quello che i criteri che la funzione utilizza. Sta usando l'azione, requestCode, categorie, extra (sto indovinando no), ecc.?

realtà il suggerimento è nella descrizione della classe:

Una descrizione di un'azione intenti e di destinazione per eseguire con esso. istanze di questa classe sono creati con

getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content.Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), getService (android.content.Context, int, android.content.Intent, int);

l'oggetto restituito può essere passato ad altre applicazioni in modo che siano in grado di eseguire l'azione da te descritta per tuo conto in un secondo momento.

Dando un PendingIntent a un'altra applicazione, l'utente garantisce che il diritto di eseguire l'operazione è stato specificato come se l'altro applicazione è stata da soli (con le stesse autorizzazioni e identità). Come , dovresti fare attenzione a come costruisci PendingIntent: quasi sempre, ad esempio, l'intento di base che fornisci dovrebbe avere il nome del componente impostato esplicitamente su uno dei tuoi componenti, per garantire che venga inviato lì e da nessun'altra parte.

Un PendingIntent stesso è semplicemente un riferimento a un token gestito dal sistema che descrive i dati originali utilizzati per recuperarlo. Ciò significa che, anche se il suo processo di applicazione di viene ucciso, lo stesso PendingIntent rimarrà utilizzabile da altri processi a cui è stato fornito.Se l'applicazione di creazione recupera in seguito lo stesso tipo di PendingIntent (stessa operazione, stessa azione Intent, dati, categorie e componenti, e gli stessi flag), riceverà un PendingIntent che rappresenta lo stesso token se questo è ancora valido e può quindi chiamare cancel() per rimuoverlo.

A causa di questo comportamento, è importante sapere quando due Intenti sono considerati uguali per il recupero di un PendingIntent. Un errore comune è creare più oggetti PendingIntent con Intenti che variano solo nei loro contenuti "extra", aspettandosi di ottenere ogni volta un PendingIntent diverso. Questo non succede . Le parti dell'Intento utilizzate per la corrispondenza sono le stesse definite da Intent.filterEquals. Se si utilizzano due intenti oggetti equivalenti a Intent.filterEquals, allora lo otterrà lo stesso PendingIntent per entrambi.

Ci sono due modi tipici per affrontare questo.

Se veramente bisogno di oggetti attivi multipla distinta PendingIntent allo stesso tempo (come ad esempio da utilizzare come due notifiche che sono entrambi mostrati allo stesso tempo), allora si avrà necessità di assicurarsi che ci sia qualcosa che è diverso su di loro a associarli a diversi PendingIntents. Può trattarsi di uno degli attributi Intento prefisso considerati da Intent.filterEquals o di numeri interi diversi da getActivity (android.content.Context, int, android.content.Intent, int), getActivities (android.content. Context, int, android.content.Intent [], int), getBroadcast (android.content.Context, int, android.content.Intent, int), o getService (android.content.Context, int, android.content .Intent, int).

Se avete solo bisogno di un PendingIntent attiva alla volta per una qualsiasi delle Intenti si intende utilizzare, quindi è possibile in alternativa utilizzare la bandiere FLAG_CANCEL_CURRENT o FLAG_UPDATE_CURRENT di annullare o modificare qualunque PendingIntent corrente è associato con l'intento voi sono fornitura.

da: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/app/PendingIntent.java#PendingIntent

+0

Mi sto chiedendo cosa faccia questa funzione: "Sto indovinando che questo flag utilizza [PendingIntent.equals] (https://github.com/android/platform_framework_base/blob/59701b9ba5c453e327bc0e6873a9f6ff87a10391/core/java/android/app /PendingIntent.java#L915), ma non sono proprio sicuro dei criteri utilizzati da questa funzione " –

+0

Di solito le persone guardano la fonte per capire le cose sucj e questo è il motivo per cui le sto mostrando. – Stan

+0

Di solito apprezzo il codice sorgente in una risposta! Di solito è fantastico per aiutare a spiegare/supportare una risposta. Ma ho incollato un link esattamente al codice che hai incollato. Non capisco quel codice, quindi sto cercando una spiegazione, non solo una copia/passato di codice a cui mi sono collegato. –

Problemi correlati