Utilizar una notificación persistente para permitir que el usuario vuelva a ejecutar la aplicación de Android

Estoy desarrollando una aplicación con numerosas actividades. Me gustaría crear una notificación persistente que (más o menos) dice, "AppName – Return to AppName" que estará presente cada vez que mis servicios de fondo se ejecutan. La creación y eliminación de la notificación no fue un problema.

Ahora, el usuario puede estar en cualquiera de varias pantallas / Actividades, salir de la aplicación, a continuación, desea volver a introducir la aplicación a través de la notificación. El problema es que la notificación debe tener una intención, que inicie una Actividad predeterminada . Quiero que la notificación vuelva a ingresar a la aplicación en cualquier Actividad que esté en la parte superior de la pila de historiales .

Mi primer intento en una solución fea fue hacer una actividad (vamos a llamar "returnFromNotify"), cuyo único trabajo era "terminar" en sí es "onCreate". La notificación abriría "returnFromNotify" en el ámbito del historial de aplicaciones, que luego se eliminaría inmediatamente, enviando al usuario de nuevo al estado del historial anterior en la pila de aplicaciones. Esto parece funcionar … a menos que el usuario haya utilizado "volver" para salir completamente de la aplicación. Luego, cuando reciben la notificación, "returnFromNotify" se carga, y luego termina, enviándolos de vuelta a la pantalla de inicio (ya que no hay actividades en la pila de historiales de la aplicación).

Consideré tratar de detectar si había algo en la pila de historia antes de "returnFromNotify", y si no, encender mi principal actividad. Parece que no puedo encontrar una manera de hacer esto, tampoco.

¿Alguna entrada o sugerencias para un novato de Java / Android? FYI, Mi historia principal es con lenguajes basados ​​en script.

5 Solutions collect form web for “Utilizar una notificación persistente para permitir que el usuario vuelva a ejecutar la aplicación de Android”

Me gusta su idea original de crear una actividad "returnFromNotify" mejor que su solución propuesta, ya que es posible detectar si la ResumeActivity está en la parte inferior de la pila (y, por tanto, la única actividad en la pila).

Así es como puede hacerlo:

Agregue su ResumeActivity al manifiesto y especifique el atributo noHistory :

<activity android:name=".ResumeActivity" android:noHistory="true" /> 

Especificar noHistory se asegurará de que esta Actividad no quede en la pila tan pronto como termine. De esta manera usted sabe que sólo una instancia actualmente en ejecución de ResumeActivity aparecerá en la pila.

Para comprobar la pila de aplicaciones, también tendrá que pedir el permiso de GET_TASKS:

 <uses-permission android:name="android.permission.GET_TASKS" /> 

Ahora puede utilizar ActivityManager :: getRunningTasks () para determinar si ResumeActivity es la única actividad en la pila:

 public class ResumeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if(isOnlyActivityInStack()) { //check the application stack //This activity is the only activity in the application stack, so we need to launch the main activity Intent main = new Intent(this, MainActivity.class); main.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(main); } else { //Return the user to the last activity they had open this.finish(); } } /** * Checks the currently running tasks. If this activity is the base activity, we know it's the only activity in the stack * * @return boolean This activity is the only activity in the stack? **/ private boolean isOnlyActivityInStack() { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean onlyActivityInStack = false; for(RunningTaskInfo tasks : manager.getRunningTasks(Integer.MAX_VALUE)) { if(tasks.baseActivity.getPackageName().equals(this.getPackageName())) { //find this package's application stack if(tasks.baseActivity.getClassName().equals(this.getClass().getName())) { //If the ResumeActivity is the base activity, we know that it is the only activity in the stack onlyActivityInStack = true; break; } } } return onlyActivityInStack; } } 

Sé que usted hizo esta pregunta hace más de 2 años, pero estoy proporcionando esta respuesta en caso de que alguien más se ejecute en esta situación particular (como lo hice). Creo que usted estaba en el camino correcto con la solución que originalmente estaban trabajando hacia.

Bueno, creo que he encontrado un trabajo satisfactorio para mi caso específico . He añadido un entero estático a mi "mainActivity", y cada vez que es "onCreate" se dispara, se incrementa el entero. Cada vez que es "onDestroy" es despedido, decrementa.

En mi "returnFromNotify", miro el entero estático para ver si es mayor que 0. Si es así, asumo que hay una activa "mainActivity", y que ejecutar "finish" dentro de "returnFromNotify" volverá allí. De lo contrario, se supone que los usuarios han "respaldado", termina, y luego usa "startActivity" para iniciar una nueva instancia de "mainActivity".

Esta no es una solución universal, pero para mis propósitos, creo que será suficiente. Todavía estoy abierto a otras respuestas, y si alguien puede perforar un agujero en mi lógica, por favor hágalo – la crítica constructiva es bienvenida. Gracias.

Supongo que no hay manera fácil de hacer esto, pero en lugar de agregar un contador en el mainActivity me extendería Aplicación :

Clase base para aquellos que necesitan mantener el estado de la aplicación global. Puede proporcionar su propia implementación especificando su nombre en la etiqueta de AndroidManifest.xml, que hará que esa clase se instancia para usted cuando se crea el proceso para su aplicación / paquete.

Yo mantein la lógica allí y tienen un método como:

 public Intent getIntentForLastActivityShown(); 

Para ser llamado cuando se hace clic en el elemento de notificación.

Mi primer enfoque sería usar SharedPreferences y almacenar un par de valores clave llamado algo como lastDisplayedActivity . Entonces en onResume cada actividad (y posiblemente onCreate) tendría una línea como esta:

 sharedPreferences.edit().putInteger("lastDisplayedActivity", ReturnFromNotify.THIS_ACTIVITY_NAME); 

En otras palabras, almacena una variable de toda la aplicación que indica qué actividad se mostró por última vez. A continuación, sólo tienes que agarrar esta variable de SharedPreferences y lanzar la actividad correspondiente.

Normalmente utilizo la actividad llamada "Launcher" que comprueba el estado de mi modelo de aplicación e inicia actividades (o hace otras cosas) dependiendo de las reglas del modelo. Puse el objeto del modelo en mi clase de la aplicación. El modelo puede usar Preferencias para almacenar su estado. Lo hago para evitar los campos estáticos en las actividades.

  • ¿Cómo obtener URI actual / tono de llamada predeterminado para SMS entrantes?
  • ¿Cuál es la diferencia entre C2DM y GCM
  • Cancelar notificación dinámica en Android cuando se selecciona la notificación
  • ¿Cómo obtener un notificador de aplicación PERMANENTE en la barra de estado?
  • RemoteView no muestra botones en la notificación personalizada
  • El icono de notificación está en gris
  • PendingIntent funciona correctamente para la primera notificación pero incorrectamente para el resto
  • Notificación de sonido, vibración y LED no funcionan
  • TaskStackBuilder.addParentStack no funciona cuando estaba construyendo una notificación
  • El icono de la barra de notificaciones se vuelve blanco en Android L
  • ¿Por qué los iconos establecidos con Notification.Builder.setSmallIcon en Android Lollipop muestran como un cuadrado blanco?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.