Diferencias entre Intent y PendingIntent

97

Leí algunos artículos y ambos parecen hacer lo mismo y me preguntaba cuál es la diferencia entre iniciar el servicio así:

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

o así:

Calendar cal = Calendar.getInstance();
Intent intent = new Intent(this, MyService.class);
PendingIntent pintent = PendingIntent.getService(this, 0, intent, 0);
AlarmManager alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 30*1000, pintent); 

Mientras leo, estos dos hacen lo mismo, si en el servicio devuelve un parámetro START_STICKY;

usuario3629316
fuente
No hay diferencia. ¿Qué te hace pensar que habría? En el primer caso, lo está iniciando 'ahora' y en el segundo simplemente lo está programando para una fecha / hora posterior.
Squonk
Posible duplicado de ¿Qué es un Android PendingIntent?
James Moore

Respuestas:

150

Intención

Un intento de Android es un objeto que lleva un intento, es decir, un mensaje de un componente a otro, ya sea dentro o fuera de la aplicación. Las intenciones pueden comunicar mensajes entre cualquiera de los tres componentes centrales de una aplicación: actividades, servicios y receptores de difusión.

La intención en sí, un objeto de intención, es una estructura de datos pasiva. Contiene una descripción abstracta de una operación a realizar.

Por ejemplo: digamos que tiene una actividad que necesita iniciar un cliente de correo electrónico y enviar un correo electrónico. Para hacer esto, su Actividad enviaría un Intent con la acción ACTION_SEND, junto con el selector apropiado, al Resolver Intent de Android:

Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:")); // only email apps should handle this

El selector especificado proporciona la interfaz adecuada para que el usuario elija cómo enviar sus datos de correo electrónico.

INTENCIONES EXPLÍCITAS

// Explicit Intent by specifying its class name
   Intent i = new Intent(this, TargetActivity.class);
   i.putExtra("Key1", "ABC");
   i.putExtra("Key2", "123");

// Starts TargetActivity
   startActivity(i);

INTENCIONES IMPLÍCITAS

// Implicit Intent by specifying a URI
   Intent i = new Intent(Intent.ACTION_VIEW, 
   Uri.parse("http://www.example.com"));

// Starts Implicit Activity
   startActivity(i); 

Intención pendiente

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

Al otorgar un PendingIntent a otra aplicación, le otorga el derecho a 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: casi siempre, por ejemplo, el Intent base que proporciona debe tener 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.

Ejemplo de intención pendiente: http://android-pending-intent.blogspot.in/

Fuente: Intents de Android e Intents pendientes de Android

Espero que esto ayude.

Siddharth_Vyas
fuente
26

PendingIntentes un envoltorio de Intent. La aplicación externa que recibe el PendingIntent, no sabe el contenido del Intentcual está envuelto PendingIntent. La misión de la aplicación extranjera es devolver la intención al propietario cuando se cumplen algunas condiciones (por ejemplo: alarma con horario o notificación con clic ...). Las condiciones las da el propietario, pero las procesa 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 => su aplicación obtiene el recurso de rendimiento del sistema.

HungNM2
fuente
5

Otra simple diferencia:

  • La intención normal morirá tan pronto como se elimine la aplicación.

  • Las intenciones pendientes nunca mueren. Estarán con vida mientras sea necesario para el servicio de alarma, el servicio de ubicación o cualquier otro servicio.

Zumry Mohamed
fuente
1

Iniciar servicios regularmente a través de AlarmManager

Al igual que con las actividades, el sistema Android puede finalizar el proceso de un servicio en cualquier momento para ahorrar recursos. Por esta razón, no puede simplemente usar un TimerTasken el servicio para asegurarse de que se ejecute de forma regular.

Entonces, para la correcta programación del Servicio, use la AlarmManagerclase.

ACTUALIZAR:

Entonces no hay diferencia real entre los dos. Pero dependiendo de si quieres asegurar la ejecución del servicio o no, puedes decidir qué usar ya que para el primero no hay garantía y para el posterior sí.

Más información en AndroidServices .

Dios mío
fuente
2
En realidad, esto no responde a la pregunta del OP que es "cuál es la diferencia" entre iniciar directamente un servicio y comenzar un servicio con una alarma. Además, el OP probablemente haya visto el artículo al que se vincula, ya que el código del artículo es casi idéntico al que ha publicado el OP.
Squonk
¿Quiere decir que iniciar un servicio desde AlarmManager es más seguro y menos propenso a morir que por una actividad? Creo que es un error. Puede usted explicar por favor. @VedPrakash. Además, creo que el contexto que se pasa al crear la intención de iniciar el servicio es más importante. Usar el contexto de la aplicación (getApplicationContext ()) en lugar del de una actividad (this), debería ser más seguro.
Parth Kapoor
@ Eu.Dr. Te recomiendo usar el administrador de alarmas que se activará cada vez que X ... ejecutes la tarea .. ¿Por qué? porque si usa servicios, es posible que se cierre en algún momento y que termine omitiendo algunas actualizaciones en un momento determinado (desconocido). Si tiene dudas sobre el contexto, nunca lo use getApplicationContext()o lo use cuando lo desee estrictamente, solo lea - when-to-call-activity-context-or-application-context ( stackoverflow.com/questions/7298731/… ).
Dios mío
1

Funcionalmente, no hay diferencia.

El significado de PendingIntent es que puede manejarlo en otra aplicación que luego puede usarlo como si la otra aplicación fuera usted mismo. Aquí está la explicación relevante de la documentación :

Al otorgar un PendingIntent a otra aplicación, le otorga el derecho a 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: casi siempre, por ejemplo, el Intent base que proporciona debe tener 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.

Entonces, PendingIntent es solo una referencia a los datos que representan el Intent original (que se usó para crear el PendingIntent).

kupsef
fuente
4
Decir que funcionalmente no hay diferencia es incorrecto. Si las funciones de ambos son iguales, ¿por qué tener dos en el primer lugar? La diferencia más importante es que PendingIntent se ejecuta mediante un componente remoto (como NotificationManager) con los mismos permisos que el componente que lo entrega (el que crea la notificación).
Aniket Thakur