2012-07-20 9 views
8

Tengo una actividad que se puede iniciar desde varias otras actividades, junto con los intentos de filtro de URL.Iniciar la actividad principal si la pila de actividades está vacía

En esta actividad utilizo el ícono de inicio en la barra de acciones como un botón de retroceso, devolviendo al usuario a la actividad anterior (y no como una acción de "inicio"). Por ahora hago esto llamando a la función finish(). Esto funciona bien cuando se trabaja desde dentro de la aplicación.

Sin embargo, si lanzo la actividad por un intento de filtro de URL, quiero que el icono de inicio lleve al usuario a la actividad principal. Obviamente, llamar a finish() simplemente cerrará la actividad.

Así que mi pregunta es, ¿hay alguna manera de comprobar si mi pila de aplicaciones está vacía y luego iniciar la actividad principal si es verdadera? ¿O estoy atacando esto de la manera incorrecta?

Respuesta

12

Si su aplicación se puso en marcha a través de URL filtro de intención y crea su propia tarea, entonces se puede utilizar

if (isTaskRoot()) { 
    // This activity is at root of task, so launch main activity 
} else { 
    // This activity isn't at root of task, so just finish() 
} 

EDIT: añadido otro método posible

Si su aplicación se lanzó a una tarea existente cuando se inicia a través del filtro de intención URL, luego puede hacer algo como lo siguiente:

Cuando inicia su actividad de otras actividades en su aplicación, agregue un EXTRA al propósito de esta manera:

Intent intent = new Intent(this, MyActivity.class); 
intent.putExtra("internal", "true"); 
startActivity(intent); 

Cuando su actividad se puso en marcha entonces se puede comprobar la presencia o ausencia de la extra en la intención de determinar si se lanzó internamente oa través de URL intención de filtro, como esto:

Intent intent = getIntent(); 
if (intent.hasExtra("internal")) { 
    // Launched internally 
} else { 
    // Launched via intent-filter 
} 
+0

Parecía una buena solución, pero lamentablemente no funciona. isTaskRoot() devuelve falso en ambas situaciones. Supongo que necesito que funcione cuando no está lanzando una nueva tarea también (es decir, ¿la aplicación ya se está ejecutando en segundo plano?). No puedo entender el manejo de la actividad/tareas. – SveinT

+1

Edité mi respuesta para agregar otro método que pueda usar ya que su actividad obviamente se inició en una tarea existente. –

+0

Eso debería funcionar, por supuesto, pero supongo que existe una solución más limpia. La aplicación Gmail y otros implementan un comportamiento similar. De cualquier manera, tendrá que hacer. ¡Gracias! – SveinT

Cuestiones relacionadas