Risposte:
A PendingIntent
è un token fornito a un'applicazione esterna (ad esempio NotificationManager
, AlarmManager
Schermata principale AppWidgetManager
o altre applicazioni di terze parti), che consente all'applicazione esterna di utilizzare le autorizzazioni dell'applicazione per eseguire un pezzo di codice predefinito .
Se dai un intento all'applicazione straniera, eseguirà il tuo Intent
con i suoi permessi. Ma se dai all'applicazione straniera un PendingIntent
, quell'applicazione eseguirà il tuo Intent
usando il permesso dell'applicazione.
Un Intento in sospeso è un token che assegni ad alcune app per eseguire un'azione per conto delle tue app indipendentemente dal fatto che il processo di candidatura sia attivo o meno.
Penso che la documentazione sia sufficientemente dettagliata: documenti in sospeso .
Basti pensare a casi d'uso per Intenti in sospeso come (Intenti di trasmissione, allarmi di pianificazione) e la documentazione diventerà più chiara e significativa.
Nel mio caso, nessuna delle risposte di cui sopra né la documentazione ufficiale di Google mi hanno aiutato ad afferrare il concetto di PendingIntent
classe.
E poi ho trovato questo video, Google I / O 2013, Al di là del Blue Dot sessione . In questo video, l'ex googler Jaikumar Ganesh spiega cos'è PendingIntent
, e questa è stata la cosa che mi ha dato il quadro generale di questo.
Di seguito è riportata solo la trascrizione del video sopra ( dalle 15:24 ).
Allora, qual è un intento in sospeso?
È un token che il processo della tua app darà al processo di localizzazione e il processo di localizzazione lo utilizzerà per riattivare l'app quando si verifica un evento di interesse . Quindi questo in pratica significa che la tua app in background non deve essere sempre in esecuzione. Quando accade qualcosa di interessante, ti svegliamo. Ciò consente di risparmiare molta batteria.
Questa spiegazione diventa più chiara con questo frammento di codice (che è incluso nella diapositiva della sessione).
PendingIntent mIntent = PendingIntent.getService(...);
mLocationClient.requestLocationUpdates(locationRequest, mIntent);
public void onHandleIntent(Intent intent) {
String action = intent.getAction();
if (ACTION_LOCATION.equals(action)) {
Location location = intent.getParcelableExtra(...)
}
}
Perché è richiesto PendingIntent? Stavo pensando come
Intent
oIntent
per lo stesso scopo.Per esempioIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
Se invio bluetoothIntent
a un'altra applicazione, che non dispone dell'autorizzazione android.permission.BLUETOOTH_ADMIN
, tale ricezione dell'applicazione non può abilitare Bluetooth con startActivity(bluetoothIntent)
.
La limitazione viene superata usando PendingIntent
. Con PendingIntent
l'applicazione di ricezione, non è necessario android.permission.BLUETOOTH_ADMIN
abilitare il Bluetooth. Fonte .
Un intento futuro che altre app possono usare.
Ed ecco un esempio per crearne uno:
Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
ANALOGIA TAXI
Intento
Gli intenti vengono in genere utilizzati per l'avvio dei servizi. Per esempio:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);
È come quando chiedi un taxi:
Myself = CurrentClass
Taxi Driver = ServiceClass
Intento in sospeso
Dovrai usare qualcosa del genere:
Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);
Ora questa terza parte inizierà il servizio agendo per tuo conto. Un'analogia della vita reale è Uber o Lyft che sono entrambe compagnie di taxi.
Invia una richiesta per un passaggio a Uber / Lyft. Andranno quindi avanti e chiameranno uno dei loro conducenti per tuo conto.
Perciò:
Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
Un PendingIntent è un token che viene fornito a un'altra applicazione (ad esempio Gestione notifiche, Gestione allarmi o altre applicazioni di terze parti), che consente a questa altra applicazione di utilizzare le autorizzazioni dell'applicazione per eseguire un pezzo di codice predefinito. Per eseguire una trasmissione tramite un intento in sospeso, procurati un PendingIntent tramite PendingIntent.getBroadcast (). Per eseguire un'attività tramite un intento in sospeso, si riceve l'attività tramite PendingIntent.getActivity ().
Che cos'è un intento?
Un Intento è un comando specifico in Android che ti consente di inviare un comando al sistema operativo Android per fare qualcosa di specifico. Pensala come un'azione che deve aver luogo. Esistono molte azioni che possono essere eseguite come l'invio di un'e-mail o il collegamento di una foto a un'e-mail o persino l'avvio di un'applicazione. Il flusso di lavoro logico per la creazione di un intento è generalmente il seguente: a. Creare l'intento b. Aggiungi opzioni Intento -> Es. quale tipo di intento stiamo inviando al sistema operativo o eventuali attributi associati a tale intento, come una stringa di testo o qualcosa che viene passato insieme all'intento c. CORRI l'intento
Esempio di vita reale: diciamo che mi sveglio la mattina e "INTENDO" per andare in bagno. Dovrò prima PENSARE di andare in bagno, ma questo non mi porta davvero in bagno. Dovrò quindi dire al mio cervello di alzarmi prima dal letto, quindi andare in bagno, quindi rilasciare, quindi andare a lavarmi le mani, poi andare a pulirmi le mani. Una volta che so dove sto andando, INVIO il comando per iniziare e il mio corpo agisce.
Cosa sono gli Intenti in sospeso?
Continuando dall'esempio della vita reale, diciamo che voglio fare una doccia ma voglio fare la doccia DOPO che mi lavo i denti e faccio colazione. Quindi so che non farò la doccia per almeno 30-40 minuti. Ho ancora nella testa che devo preparare i miei vestiti, quindi salire le scale per tornare in bagno, quindi spogliarmi e poi fare la doccia. Tuttavia ciò non accadrà fino a quando non saranno trascorsi 30-40 minuti. Ora ho l'intenzione di fare la doccia in attesa. È IN ATTESA per 30-40 minuti.
Questa è praticamente la differenza tra un Intento in sospeso e un Intento regolare. Gli Intenti regolari possono essere creati senza un Intento in sospeso, tuttavia, al fine di creare un Intento in sospeso, è necessario prima avere una configurazione di Intenti regolari.
PendingIntent
è fondamentalmente un oggetto che avvolge un altro Intent
oggetto. Quindi può essere passato a un'applicazione straniera in cui stai concedendo a quell'app il diritto di eseguire l'operazione, ovvero eseguire l'intento come se fosse eseguito dal processo della tua app (stessa autorizzazione e identità). Per motivi di sicurezza, è sempre necessario trasmettere intenzioni esplicite a un PendingIntent anziché essere implicite.
PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
In un linguaggio semplice,
1. Una descrizione di un'azione Intent e Target da eseguire. Per prima cosa devi creare un intento e poi devi passare una specifica classe java che vuoi eseguire, all'Intento.
2. Puoi chiamare quella classe java che è la tua classe di azioni di classe da PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) e PendingIntent. getService (Context, int, Intent, int); Qui vedi l'intento che deriva dal passaggio 1
3. Dovresti tenere presente che ... Dando un PendingIntent a un'altra applicazione, gli stai concedendo il diritto di eseguire l'operazione che hai specificato.
Questo è quello che ho imparato dopo una lunga lettura.
Un PendingIntent racchiude l'intento generale con un token che si concede all'app straniera per eseguire con la propria autorizzazione. Ad esempio:
La notifica della tua app musicale non può riprodurre / mettere in pausa la musica se non hai
PendingIntent
inviato l' invio perché la tua app musicale dispone delleREAD_EXTERNAL_STORAGE
autorizzazioni che l'app di notifica non ha. La notifica è un servizio di sistema (quindi è un'app straniera).
Come suggerisce il nome .. PendingIntent
puoi sospenderlo (dopo qualche tempo). Funziona come l'altro intento ... è un modo per affidare il tuo compito ad altre app per eseguire per tuo conto.
Un Intento in sospeso specifica un'azione da intraprendere in futuro. Ti consente di passare un Intento futuro a un'altra applicazione e di consentire a tale applicazione di eseguirlo come se avesse le stesse autorizzazioni dell'applicazione, indipendentemente dal fatto che l'applicazione sia ancora presente quando viene infine invocato.
È un token assegnato a un'applicazione esterna che consente all'applicazione esterna di utilizzare le autorizzazioni dell'applicazione per eseguire un pezzo di codice predefinito.
Se si assegna un intento all'applicazione esterna e tale applicazione invia / trasmette l'intento che è stato fornito, eseguiranno l'intento con le proprie autorizzazioni. Ma se invece dai all'applicazione straniera un Intento in sospeso che hai creato usando la tua autorizzazione, quell'applicazione eseguirà l'intenzione contenuta usando l'autorizzazione della tua applicazione.
Per eseguire una trasmissione tramite un intento in sospeso, procurati un PendingIntent tramite PendingIntent.getBroadcast (). Per eseguire un'attività tramite un intento in sospeso, si riceve l'attività tramite PendingIntent.getActivity ().
È un'azione intenzionale che si desidera eseguire, ma in un secondo momento. Pensa a un intento sul ghiaccio. Il motivo per cui è necessario è perché un Intento deve essere creato e avviato da un Contesto valido nell'applicazione, ma ci sono alcuni casi in cui uno non è disponibile nel momento in cui si desidera eseguire l'azione perché tecnicamente si è al di fuori del contesto dell'applicazione (il due esempi comuni sono l'avvio di un'attività da una notifica o un BroadcastReceiver.
Creando un PendingIntent che vuoi usare per lanciare, diciamo, un'attività mentre hai il contesto per farlo (dall'interno di un'altra attività o servizio) puoi passare quell'oggetto a qualcosa di esterno in modo che possa lanciare parte della tua applicazione a vostro nome.
Un PendingIntent fornisce un mezzo per il funzionamento delle applicazioni, anche dopo la chiusura del processo. È importante notare che anche dopo che l'applicazione che ha creato PendingIntent è stata eliminata, Intent può ancora essere eseguito. Una descrizione di un'azione Intento e di destinazione da eseguire con essa. Le istanze di questa classe vengono create con getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); l'oggetto restituito può essere consegnato ad altre applicazioni in modo che possano eseguire l'azione descritta per conto dell'utente in un secondo momento.
Dando un PendingIntent a un'altra applicazione, gli stai concedendo il diritto di eseguire l'operazione che hai specificato come se l'altra applicazione fosse te stesso (con le stesse autorizzazioni e identità). Pertanto, dovresti stare attento a come costruisci il PendingIntent: spesso, ad esempio, l'intento di base che fornisci avrà il nome del componente esplicitamente impostato su uno dei tuoi componenti, per assicurarti che alla fine 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 processo della propria applicazione proprietaria viene interrotto, lo stesso PendingIntent rimarrà utilizzabile da altri processi che gli sono stati dati. Se l'applicazione di creazione recupera in seguito lo stesso tipo di PendingIntent (stessa operazione, stessa azione, dati, categorie e componenti e stessi flag), riceverà un PendingIntent che rappresenta lo stesso token se è ancora valido e può quindi chiama cancel () per rimuoverlo.