2011-06-17 9 views
7

Por una razón complicada, necesito poder terminar() mis actividades cuando el usuario presiona el botón de INICIO.Cómo finalizar() una Actividad cuando se presiona el botón de Inicio

La historia aquí es que tengo un widget de pantalla de inicio que inicia una parte diferente de mi aplicación que tiene una actividad completamente transparente (por lo que la pantalla de inicio sigue apareciendo aunque mi actividad se esté ejecutando). Si las actividades anteriores finalizaron a través del botón Inicio, se ponen en primer plano y oscurecen la pantalla de inicio.

O como alternativa, ¿puedo tener la nueva actividad de alguna manera obligar a terminar() la actividad anterior?

+0

Yo recomiendo que se elimine la actividad transparente, para que la gente no se verán tentados a hacer referencia a su aplicación como software espía. – CommonsWare

+0

Gracias Mark; hay una buena razón para esta actividad transparente. Muestro la animación en mi widget de pantalla de inicio por la corta duración de la actividad transparente (se autodestruye después de 6 segundos) y no quiero que los usuarios abran otras aplicaciones, así que esto también sirve para "bloquear" la pantalla de inicio; también debe ser una actividad ya que debo realizar algunas llamadas que están disponibles solo en el hilo de la interfaz de usuario. – Yossi

+1

"No quiero que los usuarios abran otras aplicaciones": ¿por qué es bueno para el usuario? "También debe ser una actividad ya que debo realizar algunas llamadas que están disponibles solo en el hilo de la interfaz de usuario". -- ¿como? Las únicas llamadas que se me ocurren se relacionan con actividades y artilugios. – CommonsWare

Respuesta

8

¿qué pasa con

android:launchMode="singleTask" 

o

android:launchMode="singleInstance" 

en su manifiesto? Creo que singleTask es lo que quieres, pero aún no tengo una idea clara de lo que estás haciendo.

"El sistema crea la actividad en la raíz de una nueva tarea y enruta el intento. Sin embargo, si ya existe una instancia de la actividad, el sistema enruta la intención a la instancia existente mediante una llamada a su onNewIntent () método, en lugar de crear uno nuevo ". singleTask

@Override 
void onPause() { 
    super.onPause(); 
    finish(); 
} 

docs dev: Acitvity Lifecycle , Finish

+0

Gracias, pero esto también terminaría mi actividad cuando genere una actividad infantil, así que Tendría que mantener una bandera para cada vez que genero actividad infantil - torpe. – Yossi

+2

¡Lo resolvió! Esta respuesta fue la más cercana, así que la aceptaré. Agregué un finish() a [onUserLeaveHint] (http://developer.android.com/reference/android/app/Activity.html#onUserLeaveHint()) y me aseguré de que todas las llamadas a startActivity de esta actividad incluyan flag ** Intent.FLAG_ACTIVITY_NO_USER_ACTION ** por lo que ** onUserLeaveHint() ** solo se llama cuando el usuario realmente abandona mi actividad. ¡Estos chicos de la plataforma Android pensaban en todo! – Yossi

+0

jaja gracias por la aceptación, me alegro de ser amable de ayuda :) –

0

No estoy seguro de acabado() el botón de inicio de prensa, pero creo que se puede terminar() la actividad anterior usando:

Intent i = new Intent(MainActivity.this, SecondActivity.class); 
startActivity(i); 
finish(); 
Probablemente no

la mejor manera de hacerlo sin embargo. Creo que también puede llamar a la actividad principal de una subactividad y terminarla de esa manera, pero no estoy seguro.

+0

Esto terminaría la actividad en la que escribió la línea de código 'finish();'. @Yossi, quizás envíe un intento que pueda interpretar para indicar que es hora de llamar al final. Solo pensando en voz alta. – eternalmatt

+0

¡Enviar un intento me hizo pensar! ¿Qué ocurre si el elemento pendiente utilizado por mi widget incluye los indicadores a los que se hace referencia en [link] (http://stackoverflow.com/questions/5979171/clear-all-activities-in-a-task/5979351#5979351)? Eso puede explotar actividades persistentes. Lo intentaré. – Yossi

+0

No funcionó, porque las banderas en el enlace requieren API 11, lo que hace que esto sea inútil para el 99% de los dispositivos en el mercado hoy ... – Yossi

0

yo tuvimos el problema con el cierre del sonido en el botón de inicio se presiona. Hice este código a continuación. Espero que te ayude. Anula el método onpause().

@Override 
public void onPause(){ 
     System.exit(0); 
     super.onPause(); 
} 
+1

Gracias ... Me preocuparía el uso de llamadas de marco no Android. ¿Qué pasa si se desvanece algo (como punteros de archivo) que todavía se necesita para el cierre de mi aplicación? – Yossi

3

Establecer android: clearTaskOnlaunch = "true" en la actividad iniciada desde la pantalla de inicio. Ejemplo:

<activity 
 
      android:name="MainActivity" 
 
      android:exported="true" 
 
      android:clearTaskOnLaunch="true" 
 
      android:label="@string/app_name" 
 
      android:screenOrientation="portrait" > 
 
      <intent-filter> 
 
       <action android:name="android.intent.action.MAIN" /> 
 

 
       <category android:name="android.intent.category.LAUNCHER" /> 
 
      </intent-filter> 
 
     </activity>

+0

No envíe spam al sitio con enlaces de YouTube no relacionados. – laalto

+0

bien. gracias .. –

0
@Override 
public void onStop() { 
    super.onDestroy(); 
} 
Cuestiones relacionadas