toda studio setflags que pila navegar limpiar intents intent flag_activity_clear_top entre comunicar actividades android android-activity lifecycle

android - studio - ¿Cómo verificar si una actividad es la última en la pila de actividades de una aplicación?



navegar entre actividades android studio (9)

Quiero saber si el usuario volverá a la pantalla de inicio si sale de la actividad actual.


Android implementa una pila de actividades, le sugiero que la lea aquí . Parece que todo lo que quiere 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 .


El problema con la solución de sandrstar que utiliza ActivityManager es: necesita un permiso para realizar las tareas de esta manera. Encontré una mejor manera:

getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)

La Activity en la parte inferior de la pila siempre debería obtener esta categoría por defecto, mientras que otras actividades no deberían obtenerla.
Pero incluso si esto falla en algunos dispositivos, puedes configurarlo mientras comienzas tu Activity :

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


Lo único que se perdió aquí, es la tecla "Tecla de inicio", cuando está activado, no puede detectar esto desde su actividad, por lo que sería mejor controlar la pila de actividades mediante programación presionando la tecla "Atrás" y moviéndose a la actividad requerida o solo haciendo los pasos necesarios.

Además, no puede estar seguro de que el inicio de su actividad de la lista "Actividad reciente" puede detectarse preestableciendo algunos datos adicionales en la intención de actividad de apertura, ya que se reutilizarán en ese caso.


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

Si intenta guardar datos, coloque el código de guardado de datos en su método onPause (). Si intentas darle al usuario una forma de cambiar de opinión sobre la existencia de la aplicación, puedes interceptar la tecla arriba / abajo para la tecla Atrás y el método onBackPressed () y presentarles un "¿Estás seguro?" rápido.


Una forma de hacer un seguimiento de esto es incluir un marcador cuando comienza una nueva actividad y verificar si el marcador existe.

Cuando comiences una nueva actividad, inserta el marcador:

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

Y luego puedes verificarlo así:

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


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

Puede usar 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 para esto, puedes usar isTaskRoot() en tu actividad


ACTUALIZACIÓN (julio de 2015):

Dado que getRunningTasks() se getRunningTasks() , de la API 21 es mejor seguir la answer raukodraug o Ed Burnette (preferiría la segunda).


Existe la posibilidad de verificar las tareas actuales y su pila usando getRunningTasks() .

Entonces, para determinar si una actividad es la última:

  • solicite permisos android.permission.GET_TASKS en el manifiesto.
  • Usa el siguiente código:

    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 será válido solo si tiene una sola tarea. Si existe la posibilidad de que exista una cantidad de tareas para su aplicación, deberá verificar otros elementos de la lista de tareas . Leer más sobre tareas Tareas y Back Stack



Creé una clase base para todas mis actividades, extendiendo 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; y sin importar la versión de API. Por supuesto, requiere que todas las actividades extiendan esta clase base, lo cual hacen, en mi caso.

Editar: He notado una instancia cuando el contador baja a cero antes de que la aplicación salga por completo, que es cuando se cambia la orientación y solo se abre una actividad. Cuando la orientación cambia, la actividad se cierra y se crea otra, por onDestroyed se llama a onDestroyed para la última actividad, y luego se llama a onCreate cuando se crea la misma actividad con la orientación modificada. Este comportamiento debe ser tenido en cuenta; OrientationEventListener podría ser utilizado.