¿Qué es un Android PendingIntent?

Soy un novato en Android. Leí la documentación de Android, pero aún necesito algunas aclaraciones. ¿Alguien puede decirme qué es exactamente un PendingIntent ?

Un PendingIntent es un token que le da a una aplicación extranjera (por ejemplo, NotificationManager , AlarmManager , AlarmManager pantalla de AppWidgetManager u otras aplicaciones de terceros), que permite a la aplicación extranjera usar los permisos de su aplicación para ejecutar un código predefinido .

Si otorga una intención a la aplicación extranjera, ejecutará su Intent con sus propios permisos. Pero si le da a la aplicación extranjera un PendingIntent , esa aplicación ejecutará su Intent usando el permiso de su aplicación.

INTENCIÓN

Los bashs 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. Transmite un mensaje
  2. Enciende la cámara
  3. Comience un servicio
  4. Lanzar una actividad
  5. Mostrar una página web o una lista de contactos
  6. Marque un número de teléfono o conteste una llamada telefónica

    Se usan de las dos maneras

1) por usted para llamar a un componente

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

El flujo de trabajo lógico para crear un bash suele ser el siguiente:

  • Crea la intención
  • segundo. Agregar opciones de bash-> Ej. qué tipo de intención estamos enviando al SO o cualquier atributo asociado con ese bash, como una cadena de texto o algo que se transmite junto con la intención
  • do. EJECUTAR el bash

Ejemplo de 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 realmente NO me lleva al baño. Luego tendré que decirle a mi cerebro que se levante de la cama primero, luego camine hacia el baño, y luego suelte, luego vaya y lave mis 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.

PENDINGINTENT

Un PendingIntent especifica una acción a realizar en el futuro. Le permite pasar un Intento futuro a otra aplicación y permitir que esa aplicación ejecute ese Intento como si tuviera los same permissions as your application , ya sea que su aplicación aún esté activa cuando el Intento sea invocado o no. Es un token que le da a una aplicación extranjera que permite a la aplicación extranjera usar los permisos de su aplicación para ejecutar un código predefinido.

Al otorgar 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 crea el PendingIntent : a menudo, por ejemplo, el Intento base que suministra tendrá el nombre del componente explícitamente establecido en uno de sus propios componentes, para garantizar que finalmente se envíe allí y en ninguna otra parte.

Es una acción intencionada que desea realizar pero más adelante. Piensa que es poner un bash en el hielo. La razón por la que se necesita es porque se debe crear y lanzar un Intento desde un Context válido en su aplicación, pero hay ciertos casos donde uno no está disponible en el momento 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 Context para hacerlo (desde el interior de otra actividad o servicio)

Continuando con el ejemplo de la vida real: digamos que quiero tomar una ducha, pero quiero duchar DESPUÉS de lavarme los dientes y desayunar. Entonces sé que no me voy a duchar por lo menos durante 30-40 minutos. Todavía tengo en mente 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 un bash PENDIENTE de ducharme. Está PENDIENTE por 30-40 minutos.

Esa es prácticamente la diferencia entre un Intento Pendiente y un Intento Regular. En breve:

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

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

Los bashs son de dos tipos: explícitos e implícitos

Propósito explícito : cuando su aplicación sabe qué componente llamar para realizar alguna acción

Propósito implícito : cuando su aplicación no sabe qué componente puede realizar exactamente su 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 Intents. Vist debajo de enlaces

  1. Slidenerd.com
  2. Android Intent Tutorial
  3. Algo mas

Un Intento 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 solicitud está activo o no.

Creo que la documentación es suficientemente detallada: documentos pendientes de intención .

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

En mi caso, ninguna de las respuestas anteriores ni la documentación oficial de google me ayudaron a captar el concepto de clase PendingIntent .

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é es PendingIntent , y eso fue lo que me dio la imagen completa de esto.

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

Entonces, ¿qué es un bash pendiente?

Es un token que su proceso de aplicación le dará al proceso de ubicación, y el proceso de ubicación lo usará para reactivar su 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 ejecutándose. Cuando ocurra 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(...) } } 

¿Por qué se requiere PendingIntent? Estaba pensando como

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

Ej. 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 de recepción, no necesita tener android.permission.BLUETOOTH_ADMIN para habilitar Bluetooth. Fuente

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 a startActivity(Intent) o StartService(Intent) .

Un bash futuro 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); 

TAXI ANALOGY

Intención

Los bashs se usan generalmente para iniciar Servicios. Por ejemplo:

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

Esto es como cuando llamas por un taxi:

 Myself = CurrentClass Taxi Driver = ServiceClass 

Intención pendiente

Deberá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 comenzará el servicio actuando en su nombre. Una analogía de la vida real es Uber o Lyft, que son ambas compañías de taxis.

Usted envía una solicitud de transporte a Uber / Lyft. Luego seguirán adelante 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 

Un PendingIntent es un token que le da a otra aplicación (por ejemplo, Administrador de notificaciones, Alarm Manager 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 un bash pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast (). Para realizar una actividad mediante un bash pendiente, recibe la actividad a través de PendingIntent.getActivity ().

¿Qué es un bash?

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 o adjuntar una foto a un correo electrónico o incluso iniciar una aplicación. El flujo de trabajo lógico para crear un bash suele ser el siguiente: a. Crea el Intento b. Agregar opciones de Intento -> Ej. qué tipo de intención estamos enviando al SO o cualquier atributo asociado con ese bash, como una cadena de texto o algo que se transmite junto con el bash c. EJECUTAR el bash

Ejemplo de 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 realmente NO me lleva al baño. Luego tendré que decirle a mi cerebro que se levante de la cama primero, luego camine hacia el baño, y luego suelte, luego vaya y lave mis 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é es Intents Pendientes?

Continuando con el ejemplo de la vida real, digamos que quiero tomar una ducha, pero quiero duchar DESPUÉS de lavarme los dientes y desayunar. Entonces sé que no me voy a duchar hasta por lo menos 30-40 minutos. Todavía tengo en mente 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 un bash PENDIENTE de ducharme. Está PENDIENTE por 30-40 minutos.

Esa es prácticamente la diferencia entre un Intento Pendiente y un Intento Regular. Los Intentos regulares se pueden crear sin intención pendiente, sin embargo, para crear un Intento pendiente, primero debe tener una configuración de Intención regular.

En un lenguaje fácil,
1. Una descripción de una acción de intención y objective para realizar. Primero tiene que crear un bash y luego tiene que pasar una clase java específica que desea ejecutar, al Intento.
2. Puede llamar a la clase java que es su clase de clase de acción por PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) y PendingIntent. getService (Context, int, Intent, int); Aquí puedes ver que el Intento viene del paso 1
3. Debe tener en cuenta que … Al asignar un PendingIntent a otra aplicación, le otorga el derecho de realizar la operación que ha especificado.

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

PendingIntent es básicamente un objeto que envuelve otro objeto Intent . Luego se puede pasar a una aplicación extranjera en la que se otorga 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 (mismos permisos e identidad). Por razones de seguridad, siempre debe pasar intenciones explícitas a un PendingIntent en lugar de estar implícito.

  PendingIntent aPendingIntent = PendingIntent.getService(Context, 0, aIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

Como su nombre lo sugiere .. PendingIntent

puedes colgar (hazlo después de un tiempo). Funciona como la otra intención … es una forma de asignar tu tarea a otra aplicación para que actúe en tu nombre.

Un PendingIntent ajusta el Intento general con un token que le das a una aplicación extranjera para que se ejecute con tu permiso. Por ejemplo:

La notificación de tu aplicación de música no puede reproducir / pausar la música si no le has dado al PendingIntent para que envíe la transmisión porque tu aplicación de música tiene el permiso READ_EXTERNAL_STORAGE que la aplicación de notificación no lo hace. La notificación es un servicio del sistema (por lo que es una aplicación extranjera).

PendingIntent es básicamente un objeto que envuelve otro objeto Intent. Luego se puede pasar a una aplicación extranjera en la que se otorga 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 (mismos permisos e identidad). Al otorgar 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).

Un Intento Pendiente especifica una acción a tomar en el futuro. Le permite pasar un Intento futuro a otra aplicación y permitir que esa aplicación ejecute ese Intento como si tuviera los mismos permisos que su aplicación, ya sea que su aplicación aún esté activa cuando el Intento sea invocado o no.

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

Si le da un bash a la aplicación extranjera, y esa aplicación envía / transmite la intención que dio, ejecutarán la intención con sus propios permisos. Pero si, en cambio, le otorga a la aplicación extranjera un Intento pendiente creado con su propio permiso, esa aplicación ejecutará el Intento contenido utilizando el permiso de su aplicación.

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

Es una acción intencionada que desea realizar, pero más adelante. Piensa que es poner un bash en el hielo. La razón por la que se necesita es porque se debe crear y lanzar un Intento desde un Contexto válido en su aplicación, pero hay ciertos casos donde uno no está disponible en el momento 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 de una notificación o un BroadcastReceiver.

Al crear un PendingIntent que desee utilizar para iniciar, digamos, una Actividad mientras tiene el Contexto para hacerlo (desde el interior de otra Actividad o Servicio) puede pasar ese objeto a algo externo para que pueda iniciar parte de su aplicación en su nombre.

Un PendingIntent proporciona un medio para que las aplicaciones funcionen, incluso después de que finaliza su proceso. Es importante tener en cuenta que incluso después de que la aplicación que creó el PendingIntent haya sido eliminada, ese Intent aún puede ejecutarse. Una descripción de una acción de intención y objective 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 otorgar 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 crea el PendingIntent: a menudo, por ejemplo, el Intento base que suministra tendrá el nombre del componente explícitamente establecido en uno de sus propios componentes, para garantizar que finalmente se envíe allí y en ninguna otra parte.

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 la aplicación propietaria, PendingIntent seguirá siendo utilizable de otros procesos que se le han otorgado. Si la aplicación creadora vuelve a recuperar el mismo tipo de PendingIntent (misma operación, misma acción de intención, datos, categorías y componentes, y los mismos indicadores), recibirá un PendingIntent que representa el mismo token si eso sigue siendo válido, y puede por lo tanto, llame a cancel () para eliminarlo.

La intención pendiente es una intención que proporciona todos los permisos para que otra aplicación realice un trabajo en particular. Cuando se destruye la actividad principal, Android OS recupera el permiso de la misma.

PendingIntent es un envoltorio de Intención. La aplicación extranjera que recibe PendingIntent no conoce el contenido de Intento que está incluido en PendingIntent. La misión de la aplicación extranjera es enviar la intención al propietario cuando se cumplen algunas condiciones (por ejemplo, alarma con progtwigción 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 envía intenciones a su aplicación, significa que la aplicación extranjera conoce el contenido de la intención. y la aplicación extranjera toma la decisión de enviar un bash, luego su aplicación debe procesar el bash de cumplir con algunas condiciones para que su aplicación obtenga recursos de rendimiento del sistema.