Activación inteligente "androide" desde una notificación push
Tengo una tarea simple: activar una aplicación desde el empuje de una actividad en particular (no en la actividad de inicio)
Imaging Tengo 3 actividades en la aplicación:
- La aplicación Ionic / Cordova no recibe notificación push en el fondo
- ¿Está com.google.android.c2dm.intent.RECEIVE todavía en uso?
- La aplicación se bloquea si la aplicación se cierra mediante el servicio Push: parse.com
- Nuevo error de origen desconocido del registro de la API de GCM
- Spring pedalea cliente web sockets para android
- A (splash)
- B (lista de artículos)
- C (detalles del artículo seleccionado)
Algunos requisitos previos:
- Con el empuje estoy consiguiendo el id del artículo para seleccionar.
- En el chapoteo estoy forzando una autentificación.
- Una de las condiciones – no podría mover la autentificación digamos a otra actividad o al servicio de la aplicación por ejemplo.
Ahora podría crear varias declaraciones. Cuando toco presionar para activar la aplicación:
- Cuando Push es llegado el PushIntentService genera una notificación que especifica el id del artículo en los extras de la intención Si la aplicación se terminó debería iniciar la aplicación de la actividad A (para forzar la autenticación)
- Si la aplicación estuviera en segundo plano (funciona en segundo plano) debería volver a activarla en el mismo lugar (para omitir la autenticación)
- Una vez que la aplicación esté activada, navegaré a la Actividad C con el ítem del artículo extraído de los extras.
Ahora mismo estoy usando el siguiente código para generar la notificación (ítem 1, sintaxis Xamarin.Android):
var resultIntent = new Intent(Application.Context, typeof(SplashScreen)); resultIntent.AddFlags(ActivityFlags.ClearTop | ActivityFlags.SingleTop); if (extras.ContainsKey("ItemId")) { var itemId = extras["ItemId"]; resultIntent.PutExtra("ItemId", itemId); } var resultPendingIntent = PendingIntent.GetActivity(Application.Context, 0, resultIntent, 0); builder.SetContentIntent(resultPendingIntent); var notification = builder.Build();
Esta notificación funciona absolutamente bien en todos los casos, pero veo aquí un problema. Estoy reiniciando la aplicación desde el principio cada vez que estoy tocando en una notificación. Lo que quiero es cuando la aplicación es de fondo sólo necesito para activarlo (como iOS) y navegar a la página requerida (una activación más rápida y evitar la re-autenticación).
¿Cómo puedo lograr esto y modificar el código anterior?
- ¿Las notificaciones no siempre se reciben por teléfono?
- ¿Hay alguna razón para continuar usando IntentService para manejar mensajes de GCM?
- Servicio de notificación de Google / Apple Push (APNS / GCM)
- Gestión de escenarios de Notificación de empuje en iOS y Android
- Cómo implementar notificaciones push para android en React Native
- Firebase onMessageReceived no llamado cuando la aplicación está en segundo plano
- Enviar Notificaciones push a iOS / Android en WiFi cerrado (sin conexión a Internet)
- Firebase Cloud Messaging: mejores prácticas
Crear una nueva Activity
para esto. La notificación debe iniciar esa Activity
(sin ningún indicador). En onCreate()
de esta nueva Activity
, haga algo como esto:
super.onCreate(...); if (!isTaskRoot() && alreadyAuthenticated) { // Go directly to details page Intent redirectIntent = new Intent(this, Details.class) redirect.putExtra("id", itemId); startActivity(redirectIntent); else { // This means the app was not running, so redirect to Splash Intent redirectIntent = new Intent(this, Splash.class) startActivity(redirectIntent); } finish();
isTaskRoot()
devolverá true
si la aplicación no se estaba ejecutando cuando el usuario hizo clic en la Notification
. Si la aplicación ya se estaba ejecutando, debería devolver false
.
Para probar si ya está autenticado, podría llamar a un método static
o comprobar una variable static
o tal vez usted tiene algún otro método para hacer esto. Dependiendo de lo que usted desea que la pila de la Activity
parezca si el usuario estaba ya en las actividades del "detalle del artículo" o de la "lista del artículo", usted puede querer agregar SINGLE_TOP
y / o CLEAR_TOP
al redirigir a los detalles del artículo Activity
.
Espero que entiendas el punto.
Encontré la respuesta sobre cómo simular el icono del lanzador. Lo estoy usando para crear una intención pendiente para mi empuje:
var launchIntent = PackageManager.GetLaunchIntentForPackage(PackageName);
Esto es exactamente lo que quería y funciona perfectamente bien en mi caso.
- Mejores Prácticas de Android – Comunicación entre Actividad y Fragmentos
- La mejor manera de manejar el error de entrada duplicado