android - open - pendingintent notificationcompat
¿Qué es un Android PendingIntent? (18)
Soy un novato en Android. Leí la documentación de Android pero todavía necesito más aclaraciones. ¿Alguien puede decirme qué es exactamente un PendingIntent
?
¿Qué es una intención?
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 lanzar una aplicación. El flujo de trabajo lógico para crear una intención suele ser el siguiente: a. Crea la Intención b. Añadir opciones de intención -> Ej. qué tipo de intento estamos enviando al sistema operativo o cualquier atributo asociado con ese intento, como una cadena de texto o algo que se pasa junto con el intento c. Correr el intento
Ejemplo de la vida real: Digamos que me levanto por la mañana y "ESTOY" para 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 salga de la cama primero, luego camine hacia el baño y luego suelte, luego vaya y lave mis manos, luego vaya y me limpie las manos. Una vez que sé a dónde voy, ENVÍO el comando para comenzar y mi cuerpo toma medidas.
¿Qué es intenciones 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 voy a bañar hasta por lo menos 30-40 minutos. Todavía tengo en mi cabeza que necesito preparar mi ropa, y luego subir las escaleras de vuelta 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. Los 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.
Como su nombre lo sugiere ... PendingIntent
Puedes pendirlo (hacerlo después de un tiempo). Funciona como la otra intención ... es una forma de asignar su tarea a alguna otra aplicación para que la realice en su nombre.
En mi caso, ninguna de las respuestas anteriores ni PENDINGINTENT me ayudaron a captar el concepto de clase PendingIntent
.
Y luego encontré este video, Google I / O 2013, Más allá de la sesión Blue Dot . En este video, el ex googler Jaikumar Ganesh explica qué es PendingIntent
, y eso fue lo que me dio el panorama general de esto.
A continuación se muestra la transcripción del video de arriba ( de 15:24 ).
Entonces, ¿qué es una intención pendiente?
Es un token que su proceso de aplicación le dará al proceso de ubicación, y el proceso de ubicación lo utilizará 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 ocurra 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 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(...)
}
}
En un lenguaje fácil,
1. Una descripción de una acción de Intención y Objetivo a realizar. Primero debe crear una intención y luego pasar una clase java específica que desea ejecutar, a la intención.
2. Puede llamar a la clase java que es su clase de acción de clase mediante PendingIntent.getActivity, PendingIntent.getActivities (Context, int, Intent [], int), PendingIntent.getBroadcast (Context, int, Intent, int) y PendingIntent. getService (Context, int, Intent, int); Aquí se ve que la Intención que viene viene del paso 1.
3. Debe tener en cuenta que ... Al otorgar 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.
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)
.
La intención pendiente es una intención que otorga todos los permisos a otras aplicaciones para realizar un trabajo en particular. Cuando se destruye la actividad principal, el sistema operativo Android le quita el permiso.
PendingIntent es básicamente un objeto que envuelve otro objeto Intent. Luego, se puede pasar a una aplicación extranjera donde está otorgando a esa aplicación el derecho a realizar la operación, es decir, ejecutar la intención como si se hubiera ejecutado desde el proceso de su propia aplicación (el mismo permiso e identidad). Al otorgar 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 (con los mismos permisos e identidad).
PendingIntent es un envoltorio de Intención. La aplicación extranjera que recibe el PendingIntent, no conoce el contenido de Intent que está envuelto por PendingIntent. La misión de la aplicación extranjera es devolver la intención al propietario cuando se cumplan 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ó la intención 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 la intención, entonces su aplicación debe procesar la intención para cumplir con algunas condiciones para que su aplicación obtenga recursos del sistema.
Un PendingIntent
es un token que le da a una aplicación extranjera (por ejemplo, NotificationManager
, AlarmManager
, Home Screen AppWidgetManager
u otras aplicaciones de terceros), que permite que la aplicación extranjera utilice los permisos de su aplicación para ejecutar una parte de código predefinida .
Si le das un intento a la aplicación extranjera, ejecutará tu Intent
con sus propios permisos. Pero si le da a la aplicación extranjera un PendingIntent
, esa aplicación ejecutará su Intent
con el permiso de su aplicación.
Un intento pendiente especifica una acción a realizar en el futuro. Le permite pasar una Intención futura a otra aplicación y permitir que la 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é activa cuando se invoque la Intención.
Es un token que le da a una aplicación extranjera que le permite a la aplicación extranjera utilizar los permisos de su aplicación para ejecutar un código predefinido.
Si le asigna un intento a la aplicación extranjera, y esa aplicación envía / difunde el intento que usted dio, ejecutarán el intento con sus propios permisos. Pero si en cambio le da a la aplicación extranjera un Intención Pendiente que creó con su propio permiso, esa aplicación ejecutará el Intento contenido con el permiso de su aplicación.
Para realizar una transmisión a través de un intento pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast (). Para realizar una actividad a través de un intento pendiente, recibe la actividad a través de PendingIntent.getActivity ().
Es una acción de Intención que desea realizar, pero más adelante. Piensa que es un intento de hielo. La razón por la que se necesita es porque se debe crear e iniciar una Intención 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 utilizar para iniciar, digamos, una Actividad mientras tenga el Contexto para hacerlo (desde dentro 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 el proceso haya finalizado. Es importante tener en cuenta que incluso después de que se haya eliminado la aplicación que creó el PendingIntent, ese Intent todavía puede ejecutarse. Una descripción de un Intento y acción objetivo para realizar con él. 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 está otorgando el derecho de realizar la operación que ha especificado como si la otra aplicación fuera usted (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 garantizar 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 cancela el proceso de su aplicación propietaria, el propio PendingIntent seguirá siendo utilizable desde otros procesos que se le hayan dado. Si la aplicación creadora recupera posteriormente el mismo tipo de PendingIntent (la misma operación, la misma acción de Intención, datos, categorías y componentes, y las mismas banderas), recibirá una PendingIntent que representa el mismo token si eso sigue siendo válido, y puede por lo tanto, llame a cancel () para eliminarlo.
Un PendingIntent envuelve la Intención general con un token que le das a una aplicación extranjera para que 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 le dio el
PendingIntent
para enviar transmisión porque su aplicación de música tiene el permisoREAD_EXTERNAL_STORAGE
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).
Un PendingIntent es un token que le da a otra aplicación (por ejemplo, Notification Manager, 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 fragmento de código predefinido. Para realizar una transmisión a través de un intento pendiente, obtenga un PendingIntent a través de PendingIntent.getBroadcast (). Para realizar una actividad a través de un intento pendiente, recibe la actividad a través de PendingIntent.getActivity ().
Un intento pendiente es un token que le da a alguna aplicación para realizar una acción en nombre de sus aplicaciones, independientemente de si el proceso de su aplicación está vivo o no.
Creo que la documentación es lo suficientemente detallada: PENDINGINTENT .
Solo piense en casos de uso para Intenciones pendientes como (Intenciones de transmisión, alarmas de programación) y la documentación será más clara y significativa.
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);
Los intentos 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:
- Transmitir un mensaje
- Enciende la camara
- Iniciar un servicio
- Lanzar una actividad
- Mostrar una página web o una lista de contactos
Marque un número de teléfono o conteste 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 intención es generalmente lo siguiente:
- Crear la intención
- segundo. Añadir opciones de intención-> Ej. qué tipo de intento estamos enviando al sistema operativo o cualquier atributo asociado con ese intento, como una cadena de texto o algo que se pasa junto con el intento
- do. Correr el intento
Ejemplo de la vida real: Digamos que me levanto por la mañana y " ESTOY " para ir al baño. Primero tendré que PENSAR en ir al baño, pero eso NO me lleva 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 lave mis manos, luego vaya y me limpie las manos. Una vez que sé a dónde voy, ENVÍO el comando para comenzar y mi cuerpo toma medidas.
Un PendingIntent
especifica una acción a realizar en el futuro. Le permite pasar una Intención futura a otra aplicación y permitir que la aplicación ejecute esa Intención como si tuviera los same permissions as your application
, ya sea que su aplicación todavía esté activa cuando se invoque la Intención. Es un token que le da a una aplicación extranjera que le permite a la aplicación extranjera utilizar los permisos de su aplicación para ejecutar un código predefinido.
Al otorgar 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 (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 garantizar que finalmente se envíe allí y en ningún otro lugar.
Es una acción de Intención que desea realizar pero más adelante. Piensa que es un intento de hielo. La razón por la que se necesita es porque se debe crear e iniciar una Intención 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 (el dos ejemplos comunes son el lanzamiento de una Actividad desde una Notificación o un BroadcastReceiver
. Al crear un PendingIntent
que desea utilizar para iniciar, digamos, una Actividad mientras tiene 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 voy a ducharme durante al menos 30-40 minutos. Todavía tengo en mi cabeza que necesito preparar mi ropa, y luego subir las escaleras de vuelta 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. En breve:
Intención regular -> DOES NOT REQUIRE PENDING INTENT TO BE MADE
Intención pendiente -> REQUIRES A REGULAR INTENT TO BE CREATED
Las intenciones son de dos tipos: explícitas e implícitas.
Intención explícita : cuando su aplicación es consciente de a qué componente llamar para realizar alguna acción
Intención implícita : cuando su aplicación no es consciente de 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á la intención.
Para una idea mejor y más clara sobre los intentos. Vistar abajo los enlaces
PendingIntent
es básicamente un objeto que envuelve otro objeto Intent
. Luego, se puede pasar a una aplicación extranjera donde está otorgando a esa aplicación el derecho a realizar la operación, es decir, ejecutar la intención como si se hubiera ejecutado desde el proceso de su propia aplicación (el 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);
¿Por qué se requiere PendingIntent? Estaba pensando como
- ¿Por qué la aplicación receptora en sí no puede crear la
Intent
o - Por qué no podemos usar un
Intent
simple para el mismo propósito.
Por ejemplo, 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 utilizando PendingIntent
. Con PendingIntent
la aplicación receptora, no es necesario tener android.permission.BLUETOOTH_ADMIN
para habilitar Bluetooth. Source
ANALOGIA TAXI
Intención
Los intentos se utilizan normalmente 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.
Usted envía una solicitud de un viaje 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