¿Qué es un PendingIntent Android?


Soy un novato en Android. He leído la documentación de Android, pero todavía necesito algunas aclaraciones más. ¿Puede alguien decirme qué es exactamente un PendingIntent?

Author: edwoollard, 2010-05-11

18 answers

Un PendingIntent es un token que se da a una aplicación extranjera (p. ej. NotificationManager, AlarmManager, Pantalla de inicio AppWidgetManager, u otras aplicaciones de terceros), que permite que la aplicación extranjera use los permisos de su aplicación para ejecutar un fragmento de código predefinido.

Si le das a la aplicación extranjera una Intent, ejecutará tu Intent con sus propios permisos. Pero si le das a la aplicación extranjera un PendingIntent, esa aplicación ejecutará tu Intent usando el permiso.

 784
Author: Lie Ryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 10:39:13

INTENCIÓN

Las Intents son el mecanismo de mensajería estándar en Android que expresa la intención del usuario de realizar algún trabajo. Le permiten interactuar con otros componentes definidos por usted o por el sistema operativo Android.

Ejemplo:

  1. Difundir un mensaje
  2. Inicie la cámara
  3. Iniciar un servicio
  4. Iniciar una actividad
  5. Mostrar una página web o una lista de contactos
  6. Marque un teléfono número o responder una llamada telefónica

    Se utilizan en ambos sentidos

1) por usted para llamar a un componente

2) por el sistema para notificarle de algún evento.

El flujo de trabajo lógico para crear una intent suele ser el siguiente:

  • Crear la Intent
  • b. Añadir opciones de Intent - > Ex. qué tipo de intent estamos enviando al sistema operativo o cualquier atributo asociado con esa intent, como una cadena de texto o algo que se está pasando junto con la intención
  • c. EJECUTAR la Intent

Ejemplo de la vida real: Digamos que me despierto por la mañana y "INTENCIÓN" para ir al baño. Primero tendré que pensar en ir al baño, pero eso no me lleva al baño. Entonces tendré que decirle a mi cerebro que salga de la cama primero, luego caminar al baño, y luego soltar, luego ir y lavarme las manos, luego ir y limpiarme las manos. Una vez que sepa a dónde voy LE ENVÍO el orden para comenzar y mi cuerpo toma acción.

PENDINGINTENT

A PendingIntent especifica una acción a tomar en el futuro. Le permite pasar una Intent futura a otra aplicación y permitir que esa aplicación ejecute esa Intent como si tuviera el same permissions as your application, ya sea que su aplicación aún esté presente cuando finalmente se invoque la Intent. Es un token que le das a una aplicación extranjera que le permite a la aplicación extranjera usar los permisos de tu aplicación para ejecutar un fragmento de código predefinido.

Al darle un PendingIntent a otra aplicación, le está otorgando 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, usted debe tener cuidado acerca de cómo construir el PendingIntent: a menudo, por ejemplo, la Intent base que proporcione tendrá el nombre del componente explícitamente establecido en uno de sus propios componentes, para garantizar que finalmente se envíe allí y a ninguna parte else.

Es una acción intencionada que desea realizar pero en un momento posterior. Piensa en ello como poner una intención en el hielo. La razón por la que se necesita es porque una Intent debe crearse y ejecutarse desde un Context 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 (los dos ejemplos comunes son lanzar una Actividad desde una Notificación o un BroadcastReceiver.]} quieres usar para lanzar, digamos, una Actividad mientras tienes el Context para hacerlo (desde dentro de otra Actividad o Servicio)

Continuando con el ejemplo de la vida real: digamos que quiero tomar una ducha pero quiero ducharme DESPUÉS de lavarme los dientes y desayunar. Así que sé que no me ducharé durante al 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 desnudarme 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 Intent Pendiente y una Intent Regular. En resumen:

Intención regular -> DOES NOT REQUIRE PENDING INTENT TO BE MADE

Intención pendiente-> REQUIRES A REGULAR INTENT TO BE CREATED

Los intentos son de dos tipos: Explícito y Implícito

Explicit Intent: Cuando su aplicación es consciente de qué componente llamar para realizar alguna acción

Implicit Intent : Cuando su aplicación no es consciente de qué componente puede realizar exactamente la acción deseada. Por ejemplo, si simplemente dice que desea mostrar una URL, el sistema decide qué componente cumplirá con la intención.

Para una idea más clara y mejor sobre las Intenciones. Ver más abajo enlaces

  1. Slidenerd.com
  2. Tutorial de Intención de Android
  3. Algunos más
 234
Author: Shakeeb Ayaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 04:50:52

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

Creo que la documentación es suficientemente detallada: Pending Intent docs .

Basta con pensar en casos de uso para Intenciones Pendientes como (Intenciones de difusión, alarmas de programación) y la documentación se volverá más clara y significativa.

 45
Author: Samuh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 00:55:45

En mi caso, ninguna de las respuestas anteriores ni la documentación oficial de Google me ayudó a agarrar el concepto de PendingIntent clase.

Y luego encontré este video, Google I/O 2013, Más allá del Punto Azul sesión. En este video, el ex googler Jaikumar Ganesh explica lo que PendingIntent es, y eso fue lo que me dio el panorama general de esto.

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

Entonces, ¿qué es un pendiente su intención?

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

Esta explicación se vuelve más clara con este fragmento de código (que se incluye en 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(...)   
    }
}
 30
Author: 김준호,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-26 10:03:08

¿Por qué se requiere PendingIntent ? Estaba pensando como {[12]]}

  1. Por qué la propia aplicación receptora no puede crear el Intent o
  2. Por qué no podemos usar un simple Intent para el mismo propósito.

E. g.Intent bluetoothIntent= new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

Si envío bluetoothIntent a 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 usando PendingIntent. Con PendingIntent la aplicación receptora, no necesita android.permission.BLUETOOTH_ADMIN para habilitar Bluetooth. Fuente.

 22
Author: Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 08:13:52

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

 16
Author: Arun P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-04 07:32:00

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);
 13
Author: WhereDatApp.com,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 13:22:41

ANALOGÍA DEL TAXI

Intención

Las Intents se usan típicamente para iniciar 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

Necesitarás 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, que son ambas compañías de taxis.

Envías una solicitud de viaje a Uber/Lyft. Le a continuación, seguir adelante y llamar a uno de sus conductores en su nombre.

Por lo tanto:

Uber/Lyft ------ ThirdParty which receives PendingIntent
Myself --------- Class calling PendingIntent
Taxi Driver ---- ServiceClass
 10
Author: Akshayraj Kore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-06 13:45:42

Un PendingIntent es un token que le das a otra aplicación (por ejemplo, Administrador de Notificaciones, Administrador de Alarmas u otras aplicaciones de terceros), que permite a esta otra aplicación usar los permisos de tu aplicación para ejecutar un fragmento de código predefinido. Para realizar una transmisión a través de una intent pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast(). Para realizar una actividad a través de una intent pendiente, recibe la actividad a través de PendingIntent.getActivity().

 9
Author: srinu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 06:16:33

¿Qué es una intención?

Una Intent es un comando específico en Android que te permite enviar un comando al sistema operativo Android para hacer algo específico. Piense en ello como una acción que necesita tener lugar. Hay muchas acciones que se pueden hacer, como enviar un correo electrónico, o adjuntar una foto a un correo electrónico o incluso lanzar una aplicación. El flujo de trabajo lógico para crear una intent suele ser el siguiente: a. Crear la Intent b. Agregar opciones de Intent - > Ex. a qué tipo de intención estamos enviando el sistema operativo o cualquier atributo asociado con esa intent, como una cadena de texto o algo que se pase junto con la intent c. EJECUTAR la Intent

Ejemplo de la vida real: Digamos que me despierto por la mañana y "TENGO la INTENCIÓN" de ir al baño. Primero tendré que pensar en ir al baño, pero eso no me lleva al baño. Entonces tendré que decirle a mi cerebro que salga de la cama primero, luego caminar al baño, y luego soltar, luego ir y lavarme las manos, luego ir y limpiarme mis manos. Una vez que sé a dónde voy ENVÍO la orden para comenzar y mi cuerpo toma acción.

¿Qué Intents están pendientes?

Continuando con el ejemplo de la vida real, digamos que quiero tomar una ducha pero quiero ducharme DESPUÉS de lavarme los dientes y desayunar. Así que sé que no me ducharé hasta al 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 desnudarme 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 Intent Pendiente y una Intent Regular. Las Intents regulares se pueden crear sin una Intent Pendiente, sin embargo, para crear una Intent Pendiente primero debe tener una configuración de Intent Regular.

 7
Author: Narendra Motwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-01 05:45:46

En un lenguaje sencillo,
1. Una descripción de la Intención y la acción Objetivo a realizar. Primero tienes que crear una intent y luego tienes que pasar una clase java específica que quieres ejecutar, a la Intent.
2. Puede llamar a la 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); Aqui usted ve que la Intención que es viene del paso 1
3. Usted debe tener en cuenta that...By al dar un 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.

 4
Author: Omar Faroque Anik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-03 20:21:24

PendingIntent es básicamente un objeto que envuelve otro objeto Intent. A continuación, 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 intent como si se hubiera ejecutado desde el proceso de su propia aplicación (mismo permiso e identidad). Por razones de seguridad, siempre debe pasar intents explícitos a un PendingIntent en lugar de ser implícitos.

 PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);
 2
Author: Gowtham Subramaniam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-09 05:35:59

Como su nombre indica .. PendingIntent

Puedes colgarlo(hacerlo después de algún tiempo). Funciona como la otra intención is es una forma de dar su tarea a alguna otra aplicación para realizar en su nombre.

 1
Author: Xar E Ahmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-23 13:37:18

Un PendingIntent envuelve la Intent general con un token que le das a la aplicación extranjera para que lo 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 el PendingIntent para enviar difusión porque su aplicación de música tiene READ_EXTERNAL_STORAGE permiso que la aplicación de notificación la notificación es un servicio del sistema (por lo que es una aplicación extranjera).

 1
Author: Ashish Rawat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-23 11:47:27

PendingIntent es básicamente un objeto que envuelve otro objeto Intent. A continuación, 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 intent como si se hubiera ejecutado desde el proceso de su propia aplicación (mismo permiso e identidad). Al dar un PendingIntent a otra aplicación, le está otorgando el derecho de realizar la operación que ha especificado como si la otra aplicación fuera usted mismo (con los mismos permisos y identidad).

 1
Author: Sharanjeet Kaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-14 06:50:22

A Pending Intent especifica una acción a tomar en el futuro. Le permite pasar una Intent futura a otra aplicación y permitir que esa aplicación ejecute esa Intent como si tuviera los mismos permisos que su aplicación, independientemente de si la aplicación aún existe cuando se invoca la Intent.

Es un token que le da a una aplicación extranjera que le permite a la aplicación extranjera usar los permisos de su aplicación para ejecutar una pieza predefinida de codificar.

Si le das a la aplicación extranjera una Intent, y esa aplicación envía/difunde la Intent que diste, ejecutarán la Intent con sus propios permisos. Pero si en su lugar le da a la aplicación extranjera una Intent Pendiente que creó con su propio permiso, esa aplicación ejecutará la Intent contenida utilizando el permiso de su aplicación.

Para realizar una transmisión a través de una intent pendiente, así que obtenga un PendingIntent a través de PendingIntent.getBroadcast(). Para realizar un actividad a través de una intent pendiente recibe la actividad a través de PendingIntent.getActivity().

Es una acción de Intención que desea realizar, pero en un momento posterior. Piensa en ello como poner una intención en el hielo. La razón por la que se necesita es porque una Intent debe crearse y ejecutarse desde un contexto válido en su aplicación, pero hay ciertos casos en los que una no está disponible en el momento en que desea ejecutar la acción porque técnicamente está fuera del contexto de la aplicación (los dos algunos ejemplos son el lanzamiento de una actividad desde una Notificación o un receptor de radiodifusión.

Al crear un PendingIntent que desea usar para lanzar, 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 su proceso finalice. Es importante tener en cuenta que incluso después de que la aplicación que creó PendingIntent haya sido eliminada, esa Intent todavía 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 en un momento posterior.

Dando un PendingIntent a otra aplicación, le está otorgando 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 sobre cómo construir el PendingIntent: a menudo, por ejemplo, la Intent base que proporcione tendrá el nombre del componente explícitamente establecido 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 se mata el proceso de su aplicación propietaria, el PendingIntent en sí seguirá siendo utilizable de otros procesos que se le han dado. Si la aplicación creadora más tarde vuelve a recuperar 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 la misma señal si sigue siendo válida, y por lo tanto puede llama a cancel () para eliminarlo.

 0
Author: vikseln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 12:51:15

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

 0
Author: Neimer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-12 15:29:50

PendingIntent es un contenedor de Intent. La aplicación extranjera que recibe el PendingIntent, no conoce el contenido de Intent que está envuelto por PendingIntent. La misión de foreign app es devolver la intent al propietario cuando se cumplen algunas condiciones (Por ejemplo: alarma con horario o notificación con clic)...). Las condiciones son dadas por el propietario pero procesadas por una aplicación extranjera (Por ejemplo: alarma, notificación).

Si la aplicación extranjera envió intent a tu aplicación, significa que la aplicación extranjera conoce el contenido de la intención. y la aplicación extranjera tomar la decisión de enviar intent entonces su aplicación debe procesar intent para cumplir con algunas condiciones de su aplicación obtener recurso de rendimiento del sistema.

 0
Author: Rathaur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 05:21:31