Respuestas:
A PendingIntent
es un token que le da a una aplicación extranjera (p NotificationManager
. Ej . 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 código predefinido .
Si le da un propósito a la aplicación extranjera, la ejecutará Intent
con sus propios permisos. Pero si le das a la aplicación extranjera a PendingIntent
, esa aplicación te ejecutará Intent
usando el permiso de tu aplicación.
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.
En mi caso, ninguna de las respuestas anteriores ni la documentación oficial de Google me ayudaron a entender el concepto de PendingIntent
clase.
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é PendingIntent
es, 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(...)
}
}
¿Por qué se requiere PendingIntent? Estaba pensando como
Intent
oIntent
para el mismo propósito.P.ejIntent 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 utilizando PendingIntent
. Con PendingIntent
la aplicación receptora, no es necesario android.permission.BLUETOOTH_ADMIN
habilitar Bluetooth. Fuente .
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);
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
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 ().
¿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.
PendingIntent
es básicamente un objeto que envuelve otro Intent
objeto. 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);
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.
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
PendingIntent
transmisión de envío porque su aplicación de música tieneREAD_EXTERNAL_STORAGE
permiso 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).
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.
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.