¿Cómo comprobar si una actividad es la última en la pila de actividades de una aplicación?

Quiero saber si el usuario volvería a la pantalla de inicio si salía de la actividad actual.

Hay posibilidad de comprobar las tareas actuales y su pila con ActivityManager .

Por lo tanto, para determinar si una actividad es la última:

  • Solicite permisos de android.permission.GET_TASKS en el manifiesto.
  • Utilice el código siguiente:

    ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE ); List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10); if(taskList.get(0).numActivities == 1 && taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) { Log.i(TAG, "This is last activity in the stack"); } 

Tenga en cuenta que el código anterior sólo será válido si tiene una sola tarea. Si existe la posibilidad de que exista un número de tareas para su aplicación – Necesitará comprobar otros elementos taskList . Más información sobre las tareas Tareas y pila posterior

ACTUALIZACIÓN (Jul 2015):

Desde getRunningTasks () obtener obsoleta, de la API 21 es mejor seguir la respuesta raukodraug o Ed Burnette uno (yo preferiría segundo).

Voy a publicar el comentario de @ H9kDroid como la mejor respuesta aquí para las personas que tienen una pregunta similar.

Puede utilizar isTaskRoot para saber si la actividad es la raíz de una tarea.

espero que esto ayude

Hay una solución más fácil a esto, usted puede utilizar isTaskRoot () en su actividad

Si bien puede haber una manera de lograr esto (ver otras respuestas), sugeriría que no debería hacer eso. Las aplicaciones normales de Android no deberían saber si la pantalla de inicio está a punto de aparecer o no.

Si está intentando guardar datos, coloque el código de ahorro de datos en su método onPause (). Si está intentando darle al usuario una forma de cambiar de opinión sobre la aplicación existente, puede interceptar la tecla arriba / abajo para la tecla Atrás y el método onBackPressed () y presentarlos con un mensaje "¿Está seguro?". rápido.

Una forma de realizar un seguimiento de esto es incluir un marcador cuando inicie una nueva actividad y verifique si el marcador existe.

Siempre que inicie una nueva actividad, inserte el marcador:

 newIntent=new Intent(this, NextOne.class); newIntent.putExtra(this.getPackageName()+"myself", 0); startActivity(newIntent); 

Y puede comprobarlo de la siguiente manera:

 boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself") 

El problema con la solución de sandrstar con ActivityManager es: se necesita un permiso para obtener las tareas de esta manera. He encontrado una mejor manera:

 getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) 

La Activity en la parte inferior de la pila siempre debe obtener esta categoría predeterminada, mientras que otras actividades no deben conseguirlo.
Pero incluso si esto falla en algunos dispositivos, puede configurarlo mientras inicia su Activity :

 Intent intent = new Intent(startingActivity, SomeActivityClass.class); intent.addCategory(Intent.CATEGORY_LAUNCHER); activity.startActivity(intent); 

He creado una clase base para todas mis actividades, extendiendo la AppCompatActivity , y que tiene un contador estático:

 public abstract class BasicActivity extends AppCompatActivity { private static int activityCounter = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ++activityCounter; ... } @Override public void onDestroy() { super.onDestroy(); --activityCounter; if(activityCounter==0) { // Last instance code... } } public boolean isLastInstance() { return (activityCounter==1); } } 

Esto ha funcionado bastante bien, hasta ahora; E independientemente de la versión del API. Requiere, por supuesto, que todas las actividades extiendan esta clase base – lo que hacen, en mi caso.

Editar: he notado una instancia cuando el contador se reduce a cero antes de que la aplicación salga por completo, que es cuando la orientación se cambia y sólo una actividad está abierta. Cuando la orientación cambia, la actividad se cierra y se crea otra, de modo onDestroyed se llama para la última actividad, y luego onCreate se llama cuando se crea la misma actividad con la orientación cambiada. Este comportamiento debe ser explicado; OrientationEventListener podría ser posible.

Android implementa una pila de actividades, le sugiero que lea sobre ella aquí . Parece que todo lo que quieres hacer es recuperar la actividad de llamada: getCallingActivity() . Si la actividad actual es la primera actividad en su aplicación y la aplicación se inició desde la pantalla de inicio debería (supongo) devolver null .

La única cosa que falta aquí, es el botón "Home key", cuando se activa, no se puede detectar esto de su actividad, por lo que sería mejor controlar la pila de actividades mediante la programación de manipulación "Volver tecla" presione y pasar a la actividad requerida o Sólo haciendo los pasos necesarios.

Además, no puede estar seguro de que al iniciar su actividad de la lista "Actividad reciente" se pueden detectar algunos datos adicionales en la intención de abrir la actividad, ya que se reutiliza en ese caso.

  • Android ¿Cómo volver a conectar a AsyncTask después onDestroy () y relanzar onCreate ()?
  • Android - Tiempo de vida de las diferentes opciones de almacenamiento
  • ¿Los objetos de Scala sobreviven a que la actividad se reinicie en Android?
  • Realizando operaciones de larga duración en onDestroy
  • Ciclo de vida de la actividad de Android después de salir del sueño
  • ¿Cómo probar el código construido para salvar / restaurar el ciclo de vida de una actividad?
  • Vida de la aplicación Android: tal vez infinita?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.