Che cos'è un Android PendingIntent?


538

Sono un principiante di Android. Ho letto la documentazione di Android ma ho ancora bisogno di ulteriori chiarimenti. Qualcuno può dirmi cos'è esattamente un PendingIntent?

Risposte:


892

A PendingIntentè un token fornito a un'applicazione esterna (ad esempio NotificationManager, AlarmManagerSchermata principale AppWidgetManagero 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 Intentcon i suoi permessi. Ma se dai all'applicazione straniera un PendingIntent, quell'applicazione eseguirà il tuo Intentusando il permesso dell'applicazione.


3
ad eccezione delle notifiche, dove altro hai visto utilizzando pendingIntents? Penso di aver visto solo le notifiche usarlo ...
sviluppatore Android

4
@Johnny_D: significa ciò che dice, in generale, vorresti creare un Intento esplicito il cui nome componente è un nome assoluto che si riferisce inequivocabilmente a una delle tue classi. Altrimenti, l'intento potrebbe essere inviato a un'altra applicazione, il che potrebbe causare problemi poiché tale intento verrà eseguito su autorizzazione dell'applicazione.
Lie Ryan

3
@LieRyan, l'autorizzazione all'applicazione qui è l'autorizzazione che specifichiamo nel manifest? Per esempio. Permesso INTERNET?
Diffy,

2
Questo "trasferimento di autorizzazioni" non è davvero un problema di sicurezza? Ho un'applicazione A a cui ho concesso diverse autorizzazioni. Quindi ho l'applicazione B che utilizza molte meno autorizzazioni. Se l'applicazione A può avviare qualcosa nell'applicazione B tramite un PendingIntent (consentendo a tutte le autorizzazioni di A di essere temporaneamente su B), B non può fare tutto ciò che può dietro le quinte con tale autorizzazione? Ad esempio, A potrebbe avere il permesso di leggere i contatti dell'utente ma B no. Se A invia un PendingIntent a B, B può quindi leggere i contatti e fare qualcosa di dannoso (come inviarlo a un server).
Tiago,

6
@Tiago: nel tuo caso, se un'applicazione privilegiata A dà all'applicazione B un intento in sospeso in modo che B possa inviarlo quando vuole leggere i dati di un contatto. È responsabilità di A chiedere all'utente quali dati di contatto l'utente desidera fornire a B e fornire solo a B tali dati. Pending Intent è un meccanismo di escalation di privilegi, e proprio come qualsiasi meccanismo di escalation di privilegi, con un grande potere derivano grandi responsabilità. È responsabilità dell'utente decidere se l'applicazione B è affidabile per i dati di contatto selezionati dall'utente.
Lie Ryan,

48

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.


Penso che Intent sia anche una sorta di token che diamo ad un'altra app per eseguire un'azione per conto della nostra app. Quindi, l'unica differenza tra un intento in sospeso e un intento è la durata del processo di applicazione?
CopsOnadad

40

Nel mio caso, nessuna delle risposte di cui sopra né la documentazione ufficiale di Google mi hanno aiutato ad afferrare il concetto di PendingIntentclasse.

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(...)   
    }
}

D'accordo, è abbastanza semplice e chiaro da capire. Ma non ci dice nulla sull'autorizzazione che PendingIntent concede ad altre app.
CopsOnadad

35

Perché è richiesto PendingIntent? Stavo pensando come

  1. Perché l'applicazione ricevente stessa non può creare il Intento
  2. Perché non possiamo usare un semplice Intentper lo stesso scopo.

Per esempioIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Se invio bluetoothIntenta 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 PendingIntentl'applicazione di ricezione, non è necessario android.permission.BLUETOOTH_ADMINabilitare il Bluetooth. Fonte .


3
Il tuo esempio bluetoothIntent è davvero prezioso. Grazie
Nicks il

1
@Kiran - Se la ricezione dell'applicazione può attivare il Bluetooth (utilizzando Pending Intent), allora perché quell'app non ha incluso questa autorizzazione nel suo manifest? È come se stessi realizzando un'app in grado di effettuare una chiamata ma non includo l'autorizzazione CALL_PHONE perché desidero che altre app mi inviano un Intento in sospeso per effettuare questa chiamata. È questo che vuoi dire?
CopsOnRoad,

1
@CopsOnRoad L'app di ricezione di PendingIntent può essere un'app generale che riceve qualsiasi richiesta ed esegue la richiesta per conto del richiedente. Il suo ruolo è solo un intermediario, quindi non ha tutti i permessi. Un esempio di questo tipo di app intermedie è il gestore delle notifiche, che può avviare qualsiasi app prevista da una notifica, senza possedere l'autorizzazione.
Xiao-Feng Li

21

L'intenzione in sospeso è un'intenzione che inizierà ad un certo punto in futuro. L'intento normale inizia immediatamente quando viene passato a startActivity(Intent)o StartService(Intent).


13

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

8
Downvote perché non spieghi davvero cosa c'è di speciale in un intento che è "futuro" o utilizzabile da altre app
Vic

@ WhereDatApp.com è stato detto da Antoine de Saint Exupéry e tradotto da Lewis Galantière;)
Choletski,

@Choletski grazie, non sapevo della traduzione 👍
Oded Breiner,

13

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

11

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 ().


7

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.


Mi è piaciuto molto il semplice e l'esempio, l'ho capito abbastanza bene con quelle parole.
Josema,

Sono lieto che questo post ti sia stato utile Josema
Narendra Motwani il

questo è esattamente lo stesso della spiegazione di Shakeeb Ayaz sopra. chi ha copiato da chi? :)
likejudo

5

PendingIntentè fondamentalmente un oggetto che avvolge un altro Intentoggetto. 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);

4

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.


3

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 PendingIntentinviato l' invio perché la tua app musicale dispone delle READ_EXTERNAL_STORAGEautorizzazioni che l'app di notifica non ha. La notifica è un servizio di sistema (quindi è un'app straniera).


ottimo esempio!
Mi piace

2

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.


1
Puoi dare un esempio di vita reale per questo?
CopsOnadad

0

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.


0

Pending Intent è un intento che fornisce tutte le autorizzazioni ad altre applicazioni per eseguire un determinato lavoro. Quando l'attività principale viene distrutta, il sistema operativo Android ne riprende l'autorizzazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.