Quiero saber si el usuario volverá a la pantalla de inicio si sale de la actividad actual.
Quiero saber si el usuario volverá a la pantalla de inicio si sale de la actividad actual.
Respuestas:
ACTUALIZACIÓN (julio de 2015):
Desde getRunningTasks () quedar obsoleta, API de 21 que es mejor seguir raukodraug respuesta o Ed Burnette uno (yo preferiría segundo).
Existe la posibilidad de verificar las tareas actuales y su pila usando ActivityManager .
Entonces, para determinar si una actividad es la última:
Utilice 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 taskList . Leer más sobre tareas Tasks y Back Stack
isTaskRoot()
método.
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
if (isTaskRoot()) { // do something }
Espero que esto ayude a los nuevos principiantes. Basado en las respuestas anteriores que me funcionan bien, también estoy compartiendo un fragmento de código para que sea fácil de implementar.
solución: utilicé isTaskRoot()
que devuelve verdadero si la actividad actual es solo actividad en su pila y, aparte de que también manejo el caso en el que si tengo alguna actividad en la pila, vaya a la última actividad en la pila en lugar de abrir una nueva personalizada.
En tu actividad
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
hay una solución más fácil para esto, puede usar isTaskRoot () en su actividad
Si bien puede haber una manera de lograr esto (vea otras respuestas), le sugiero que no lo haga. Las aplicaciones normales de Android no deberían necesitar saber si la pantalla de inicio está a punto de mostrarse o no.
Si está intentando guardar datos, coloque el código de guardado de datos en su método onPause (). Si está tratando de darle al usuario una forma de cambiar de opinión acerca de la existencia de la aplicación, puede interceptar la tecla arriba / abajo para la tecla Atrás y el método onBackPressed () y presentarle un "¿Está seguro?" rápido.
Una forma de realizar un seguimiento de esto es incluir un marcador cuando inicie una nueva actividad y comprobar 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 luego puede verificarlo así:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
El problema con el uso de la solución de sandrstar ActivityManager
es: necesita un permiso para obtener las tareas de esta manera. Encontré una mejor manera:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
El Activity
en la parte inferior de la pila siempre debería obtener esta categoría de forma predeterminada, mientras que otras actividades no deberían obtenerla.
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);
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; e independientemente de la versión de API. Por supuesto, requiere que todas las actividades amplíen esta clase base, lo que hacen, en mi caso.
Editar: He notado una instancia en la que el contador baja a cero antes de que la aplicación salga por completo, que es cuando se cambia la orientación y solo una actividad está abierta. Cuando cambia la orientación, la actividad se cierra y se crea otra, por lo que 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 tenerse en cuenta; Posiblemente, se podría utilizar OrientationEventListener .
Android implementa una pila de actividades, le sugiero que lea sobre esto aquí . Parece que todo lo que quiere hacer sin embargo 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) regresar null
.
Lo único que se perdió aquí, es el clic de la "tecla Inicio", cuando se activa, no puede detectar esto en su actividad, por lo que sería mejor controlar la pila de actividades mediante programación manejando la tecla "Atrás" presionando y moviéndose a la actividad requerida o simplemente haciendo los pasos necesarios.
Además, no puede estar seguro de que el inicio de su actividad desde la lista "Actividad reciente" se puede detectar con la preconfiguración de algunos datos adicionales en la intención de la actividad de apertura, ya que se reutiliza en ese caso.