¿Qué es un Android PendingIntent?

Respuestas:

892

A PendingIntentes un token que le da a una aplicación extranjera (p NotificationManager. Ej . AlarmManager, Pantalla de inicio AppWidgetManageru otras aplicaciones de terceros), que permite que la aplicación extranjera use los permisos de su aplicación para ejecutar un código predefinido .

Si le da un propósito a la aplicación extranjera, la ejecutará Intentcon sus propios permisos. Pero si le das a la aplicación extranjera a PendingIntent, esa aplicación te ejecutará Intentusando el permiso de tu aplicación.

Lie Ryan
fuente
3
a excepción de las notificaciones, ¿dónde más has visto usando pendientesIntents? Creo que solo vi notificaciones usarlo ...
desarrollador de Android
44
@Johnny_D: significa lo que dice, en general, desearía crear una intención explícita cuyo nombre de componente sea un nombre absoluto que se refiera inequívocamente a una de sus propias clases. De lo contrario, el intento podría enviarse a otra aplicación, lo que puede causar problemas, ya que ese intento se ejecutará con el permiso de su aplicación.
Lie Ryan
3
@LieRyan, ¿el permiso de la aplicación aquí es el permiso que especificamos en el manifiesto? P.ej. ¿Permiso de Internet?
Diffy
2
¿No es esta "entrega de permisos" realmente mala en cuanto a seguridad? Tengo una aplicación A que le di varios permisos. Luego tengo la aplicación B que usa muchos menos permisos. Si la aplicación A puede iniciar algo en la aplicación B a través de un PendingIntent (permitiendo que todos los permisos de A estén en B temporalmente), ¿no puede B hacer lo que pueda detrás de escena con ese permiso? Por ejemplo, A podría tener el permiso para leer los contactos del usuario, pero B no. Si A envía un PendingIntent a B, B puede leer los contactos y hacer algo malicioso (como enviarlo a un servidor).
Tiago
66
@Tiago: en su caso, si una aplicación privilegiada A le da a la aplicación B una intención pendiente para que B pueda enviarla cuando quiera leer los datos de un contacto. Es responsabilidad de A preguntarle al usuario qué datos de contacto quiere darle a B, y solo dar B esos datos. La intención pendiente es un mecanismo de escalada de privilegios, y al igual que cualquier mecanismo de escalada de privilegios, con gran poder conlleva una gran responsabilidad. Es responsabilidad del usuario decidir si la aplicación B es confiable para los datos de contacto que seleccionó el usuario.
Lie Ryan
48

Una intención pendiente es un token que le das a alguna aplicación para realizar una acción en nombre de tus aplicaciones, independientemente de si el proceso de tu aplicación está activo o no.

Creo que la documentación es suficientemente detallada: Documentos de intención pendiente .

Solo piense en casos de uso para Intentos pendientes como (Intentos de difusión, programación de alarmas) y la documentación será más clara y significativa.

Samuh
fuente
Creo que Intent también es una especie de token que le damos a alguna otra aplicación para que realice una acción en nombre de nuestra aplicación. Entonces, ¿la única diferencia entre una intención pendiente y una intención es la vida de nuestro proceso de solicitud?
CopsOnRoad
40

En mi caso, ninguna de las respuestas anteriores ni la documentación oficial de Google me ayudaron a entender el concepto de PendingIntentclase.

Y luego encontré este video, Google I / O 2013, sesión Beyond the Blue Dot . En este video, el ex-googler Jaikumar Ganesh explica qué PendingIntentes, y eso fue lo que me dio la idea general de esto.

A continuación se muestra solo la transcripción del video anterior ( de 15:24 ).

Entonces, ¿qué es una intención pendiente?

Es un token que el proceso de su aplicación dará al proceso de ubicación, y el proceso de ubicación lo usará para activar su aplicación cuando ocurra un evento de interés . Entonces, esto básicamente significa que su aplicación en segundo plano no tiene que estar siempre ejecutándose. Cuando sucede algo de interés, lo despertaremos. Esto ahorra mucha batería.

Esta explicación se vuelve más clara con este fragmento de código (que se incluye en la diapositiva de la sesión).

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(...)   
    }
}
김준호
fuente
De acuerdo, es bastante simple y claro de entender. Pero no nos dice nada sobre el permiso que PendingIntent otorga a otra aplicación.
CopsOnRoad
35

¿Por qué se requiere PendingIntent? Estaba pensando como

  1. Por qué la aplicación receptora en sí no puede crear el Intento
  2. Por qué no podemos usar un simple Intentpara el mismo propósito.

P.ejIntent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Si envío bluetoothIntenta otra aplicación, que no tiene permiso android.permission.BLUETOOTH_ADMIN, esa aplicación receptora no puede habilitar Bluetooth con startActivity(bluetoothIntent).

La limitación se supera utilizando PendingIntent. Con PendingIntentla aplicación receptora, no es necesario android.permission.BLUETOOTH_ADMINhabilitar Bluetooth. Fuente .

Kiran
fuente
3
Su ejemplo bluetoothIntent es realmente valioso. Gracias
Nicks
1
@Kiran: si la aplicación receptora puede activar Bluetooth (usando la intención pendiente), ¿por qué esa aplicación no incluyó este permiso en su manifiesto? Es como si estuviera haciendo una aplicación que puede hacer una llamada, pero no estoy incluyendo el permiso CALL_PHONE porque quiero que otra aplicación me envíe un Intento pendiente para hacer esta llamada. ¿Es esto lo que quieres decir?
CopsOnRoad
1
@CopsOnRoad La aplicación receptora de PendingIntent puede ser una aplicación general que recibe cualquier solicitud y ejecuta la solicitud en nombre del solicitante. Su papel es solo un intermediario, por lo tanto, no tiene todos los permisos. Un ejemplo de este tipo de aplicaciones intermedias es el administrador de notificaciones, que puede iniciar cualquier aplicación prevista desde una notificación, sin tener el permiso.
Xiao-Feng Li
21

La intención pendiente es una intención que comenzará en algún momento en el futuro. La intención normal comienza inmediatamente cuando se pasa startActivity(Intent)ao StartService(Intent).

Arun P
fuente
13

Una intención futura que otras aplicaciones pueden usar.
Y aquí hay un ejemplo para crear uno:

Intent intent = new Intent(context, MainActivity.class);
PendingIntent pendIntent = PendingIntent.getActivity(context, 0, intent, 0);
Oded Breiner
fuente
8
Downvote porque no explican realmente lo que es especial acerca de una intención que es "futuro" o utilizable por otras aplicaciones
Vic
@ WhereDatApp.com fue dicho por Antoine de Saint Exupéry y traducido por Lewis Galantière;)
Choletski el
@Choletski gracias, no sabía sobre la traducción 👍
Oded Breiner
13

ANALOGÍA DE TAXI

Intención

Las intenciones se suelen utilizar para iniciar los Servicios. Por ejemplo:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
startService(intent);

Esto es como cuando llamas a un taxi:

Myself = CurrentClass
Taxi Driver = ServiceClass

Intención pendiente

Tendrá que usar algo como esto:

Intent intent = new Intent(CurrentClass.this, ServiceClass.class);
PendingIntent pi = PendingIntent.getService(parameter, parameter, intent, parameter);
getDataFromThirdParty(parameter, parameter, pi, parameter);

Ahora este tercero iniciará el servicio actuando en su nombre. Una analogía de la vida real es Uber o Lyft, ambas compañías de taxis.

Envías una solicitud de transporte a Uber / Lyft. Luego continuarán y llamarán a uno de sus conductores en su nombre.

Por lo tanto:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
ARCA
fuente
11

Un PendingIntent es un token que le da a otra aplicación (por ejemplo, Administrador de notificaciones, Administrador de alarmas u otras aplicaciones de terceros), que le permite a esta otra aplicación usar los permisos de su aplicación para ejecutar un código predefinido. Para realizar una transmisión a través de una intención pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast (). Para realizar una actividad a través de una intención pendiente, recibirá la actividad a través de PendingIntent.getActivity ().

srinu
fuente
7

¿Qué es un intento?

Un intento es un comando específico en Android que le permite enviar un comando al sistema operativo Android para hacer algo específico. Piense en ello como una acción que debe llevarse a cabo. Hay muchas acciones que se pueden hacer, como enviar un correo electrónico, adjuntar una foto a un correo electrónico o incluso iniciar una aplicación. El flujo de trabajo lógico de crear una intención suele ser el siguiente: a. Crea la intención b. Agregar opciones de intención -> Ej. qué tipo de intención enviamos al sistema operativo o cualquier atributo asociado con esa intención, como una cadena de texto o algo que se pasa junto con la intención c. CORRE la intención

Ejemplo de la vida real: Digamos que me levanto por la mañana y "INTENTO" ir al baño. Primero tendré que PENSAR en ir al baño, pero eso NO me lleva realmente al baño. Luego tendré que decirle a mi cerebro que salga de la cama primero, luego camine hacia el baño y luego suelte, luego vaya y lávese las manos, luego vaya y limpie mis manos. Una vez que sé a dónde voy, ENVÍO el comando para comenzar y mi cuerpo toma medidas.

¿Qué son las intenciones pendientes?

Continuando con el ejemplo de la vida real, digamos que quiero ducharme pero quiero ducharme DESPUÉS de lavarme los dientes y desayunar. Entonces sé que no me ducharé hasta por lo menos 30-40 minutos. Todavía tengo en mi cabeza que necesito preparar mi ropa, y luego subir las escaleras de regreso al baño, luego desvestirme y luego ducharme. Sin embargo, esto no sucederá hasta que hayan pasado 30-40 minutos. Ahora tengo una intención PENDIENTE de ducharme. Está PENDIENTE por 30-40 minutos.

Esa es prácticamente la diferencia entre una intención pendiente y una intención regular. Las intenciones regulares se pueden crear sin una intención pendiente, sin embargo, para crear una intención pendiente, primero debe tener una configuración de intención regular.

Narendra Motwani
fuente
Realmente me gustó lo simple y el ejemplo, lo entendí bastante bien con esas palabras.
Josema
Me alegra que esta publicación te sea útil Josema
Narendra Motwani
esto es exactamente lo mismo que la explicación anterior de Shakeeb Ayaz. ¿Quién copió de quién? :)
likejudo
5

PendingIntentes básicamente un objeto que envuelve otro Intentobjeto. Luego, se puede pasar a una aplicación extranjera en la que está otorgando a esa aplicación el derecho de realizar la operación, es decir, ejecutar la intención como si se hubiera ejecutado desde el proceso de su propia aplicación (mismo permiso e identidad). Por razones de seguridad, siempre debe pasar intenciones explícitas a un PendingIntent en lugar de ser implícito.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
Gowtham Subramaniam
fuente
4

En un lenguaje fácil,
1. Una descripción de una acción de Intención y Destino a realizar. Primero debe crear una intención y luego debe pasar una clase de Java específica que desea ejecutar, a la Intención.
2. Puede llamar a esa clase java, que es su clase de acción de clase, por PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) y PendingIntent. getService (Context, int, Intent, int); Aquí ves esa intención que viene del paso 1
3. Debe tener en cuenta que ... Al dar una PendingIntent a otra aplicación, le está otorgando el derecho de realizar la operación que ha especificado.

Eso es lo que aprendí después de una larga lectura.

Omar Faroque Anik
fuente
3

Un PendingIntent envuelve la Intención general con un token que le das a la aplicación extranjera para que se ejecute con tu permiso. Por ejemplo:

La notificación de su aplicación de música no puede reproducir / pausar la música si no dio la PendingIntenttransmisión de envío porque su aplicación de música tiene READ_EXTERNAL_STORAGEpermiso que la aplicación de notificación no tiene. La notificación es un servicio del sistema (por lo que es una aplicación extranjera).

Ashish Rawat
fuente
gran ejemplo!
likejudo
2

Como su nombre lo indica. PendingIntent

puedes dejarlo (hacerlo después de un tiempo). Funciona como la otra intención ... es una forma de asignar su tarea a otra aplicación para que la realice en su nombre.

Zar E Ahmer
fuente
1
¿Puedes dar un ejemplo de la vida real para esto?
CopsOnRoad
0

Una intención pendiente especifica una acción a tomar en el futuro. Le permite pasar una Intención futura a otra aplicación y permitir que esa aplicación ejecute esa Intención como si tuviera los mismos permisos que su aplicación, ya sea que su aplicación todavía esté o no cuando finalmente se invoque la Intención.

Es un token que le da a una aplicación extranjera que permite que la aplicación extranjera use los permisos de su aplicación para ejecutar un fragmento de código predefinido.

Si le da una intención a la aplicación extranjera, y esa aplicación envía / difunde la intención que usted le dio, ejecutarán la intención con sus propios permisos. Pero si, en cambio, le da a la aplicación extranjera una intención pendiente que creó con su propio permiso, esa aplicación ejecutará la intención contenida utilizando el permiso de su aplicación.

Para realizar una transmisión a través de una intención pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast (). Para realizar una actividad a través de una intención pendiente, recibirá la actividad a través de PendingIntent.getActivity ().

Es una acción de intención que desea realizar, pero en un momento posterior. Piense en ello poniendo una intención en hielo. La razón por la que se necesita es porque se debe crear y lanzar un Intent desde un contexto válido en su aplicación, pero hay ciertos casos en los que uno no está disponible en el momento en que desea ejecutar la acción porque técnicamente está fuera del contexto de la aplicación (el Dos ejemplos comunes son el lanzamiento de una actividad desde una notificación o un BroadcastReceiver.

Al crear un PendingIntent que desea usar para iniciar, por ejemplo, una Actividad mientras tiene el Contexto para hacerlo (desde dentro de otra Actividad o Servicio) puede pasar ese objeto a algo externo para que inicie parte de su aplicación en su nombre.

Un PendingIntent proporciona un medio para que las aplicaciones funcionen, incluso después de que finalice su proceso. Es importante tener en cuenta que incluso después de que la aplicación que creó el PendingIntent haya sido eliminada, esa intención aún puede ejecutarse. Una descripción de una intención y una acción objetivo para realizar con ella. Las instancias de esta clase se crean con getActivity (Context, int, Intent, int), getBroadcast (Context, int, Intent, int), getService (Context, int, Intent, int); el objeto devuelto se puede entregar a otras aplicaciones para que puedan realizar la acción que describió en su nombre más adelante.

Al dar un PendingIntent a otra aplicación, le otorga el derecho de realizar la operación que ha especificado como si la otra aplicación fuera usted mismo (con los mismos permisos e identidad). Como tal, debe tener cuidado con la forma en que construye el PendingIntent: a menudo, por ejemplo, el Intento base que proporciona tendrá el nombre del componente establecido explícitamente en uno de sus propios componentes, para asegurarse de que finalmente se envíe allí y en ningún otro lugar.

Un PendingIntent en sí mismo es simplemente una referencia a un token mantenido por el sistema que describe los datos originales utilizados para recuperarlo. Esto significa que, incluso si el proceso de su aplicación propietaria se anula, el PendingIntent mismo seguirá siendo utilizable desde otros procesos que se le hayan dado. Si la aplicación creadora luego recupera el mismo tipo de PendingIntent (misma operación, misma acción de Intent, datos, categorías y componentes, y los mismos indicadores), recibirá un PendingIntent que representa el mismo token si aún es válido, y puede entonces llame a cancel () para eliminarlo.

vikseln
fuente
0

La intención pendiente es una intención que proporciona todos los permisos a otra aplicación para hacer un trabajo en particular. Cuando se destruye la actividad principal, el sistema operativo Android recupera el permiso.

Neimer
fuente