2010-08-04 15 views
42

Tengo 3 actividades. La actividad A que lleva a la actividad B, que a su vez puede volver a la actividad A o iniciar la actividad C. Sin embargo, si presiono nuevamente en la actividad C, la aplicación debería cerrarse.Finish principal y actividad actual en Android

Para resumir:

  • Actividad A comienza la actividad B
  • presionar Volver sobre la actividad B debería conducir a una
  • Actividad B comienza la actividad C
  • presionar Volver sobre la actividad C debe cerrar la aplicación

¿Cómo debo pasar de la actividad B a C? Este código actualmente me da una NullPointerException en la última línea:

Intent intent=new Intent(ActivityB.this, ActivityC.class); 
startActivity(intent); 
ActivityB.this.finish(); 
ActivityB.this.getParent().finish(); 

Si cambio las dos últimas líneas También consigo un puntero nulo.

+13

Me gustaría señalar que tener la aplicación cerca después de presionar el botón Atrás cuando no está en la primera página de la aplicación es realmente molesto. No estoy seguro de lo que está haciendo, pero solo tenga cuidado de que los usuarios no esperen que el botón Atrás vaya a la actividad anterior – Falmarri

Respuesta

51

No sé si esto va a funcionar, pero se puede probar:

  • de la actividad A, B empezar la actividad para un resultado utilizando startActivityForResult()

  • En la actividad B, cuando el usuario activa actividad C, se inicia la actividad de C.

startActivity() vuelve inmediatamente, por lo

  • establecer un resultado que le informará de A a terminar así,

  • llamada finish() en B.

  • Cuando A recibe que resultan de B, A llama finish() sobre sí mismo también.

De no ser así, se podría hacer Actividad C en su propia aplicación y luego cerrar la primera aplicación (con A & B) después de que comienza la segunda.

P.S. ¡Considera el comentario de Falmarri a medida que avanzas!
Buena suerte.

+0

Hice lo mismo y no produjo ningún efecto – Kostadin

0

Haga que cada actividad escuche el resultado de la siguiente actividad y termínese si eso ocurre.

Puede usar un código de resultado especial para indicar que desea que la actividad termine.

10

Usted Shou utiliza onActivityResult método en su actividad padre

Supongamos que A es la actividad de los padres de la actividad B. Si desea hacer clic en el botón Atrás en la actividad B para salir de la aplicación (también salir Actividad A)

En su actividad B, en onStop() o onDestroy()

se llama

setResult(0); //any int number is fine 

esto pasará una código de resultado a su actividad principal.

Su padre actvity A, se detecta el código de resultado tendrá que utilizar onActivityResult método dentro del método que se puede llamar

if(resultCode == 0) //matches the result code passed from B 
{ 
    ActivityA.this.finish() 
} 

Funciona para mí :)

1

Esto está funcionando perfectamente :

btn_back.setOnClickListener(new View.OnClickListener() 
{ 
public void onClick(View v) { 

Player.this.finish(); 
    } 
}); 
31

Si desea terminar una actividad primaria de una actividad secundaria,

En la actividad de los padres, mientras que la activación de la actividad de los niños, utilice el siguiente comando: -

startActivityForResult(intent_name,any_integer_variable); 

y reemplazar el método onActivityResult de la siguiente manera: -

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(resultCode==2){ 
     finish(); 
    } 
} 

Ahora, en el niño actividad, anular onStop y onDestroy de la siguiente manera: -

protected void onStop() { 
    setResult(2); 
    super.onStop(); 
} 
@Override 
protected void onDestroy() { 
    setResult(2); 
    super.onDestroy(); 
} 

Observe que he configurado el valor a 2 en la actividad secundaria, y lo estoy verificando en la actividad principal. Si el valor es el mismo que he establecido, la actividad principal también finalizará. Luego puede usar enfoques recursivos para otras actividades.

+2

Hice exactamente lo mismo, pero no importa qué valor establezco en la actividad infantil usando 'setResult()', la actividad principal siempre recibe '0'. – Kushal

+1

Descubrí que 'onActivityResult' recibe una llamada antes de' onStop' y 'onDestroy', necesita 'setResult' antes. – BluGeni

+0

¿Cómo se puede usar any_integer_variable? –

0

Usted sólo puede anular el back key behavior:

Actividad A inicia la actividad B
pulsar Back sobre la actividad B debería conducir a una
actividad B se inicia la actividad C
pulsar Back sobre la actividad de C debe cerrar la aplicación

Tenga en cuenta que no llamo super desde onBackPressed. Esto también le permite anular el mecanismo de exploración de pila para Android, que me parece una gran ventaja, ya que actualmente no parece haber una manera de borrar el elemento más antiguo de la pila de exploración de una manera sencilla.

public class B extends Activity 
{ 
    ... 
    @Override 
    public void onBackPressed() 
    { 
     // Start activity A 
     Intent aIntent = new Intent(this, A); 
     startActivity(bIntent); 
    } 
    ... 
} 

public class C extends Activity 
{ 
    ... 
    @Override 
    public void onBackPressed() 
    { 
     // Close 
     finish(); 
    } 
    ... 
} 

Puede finalizar específicamente la actividad principal también si es necesario, pero con este método, no tiene que preocuparse por ello.

3

Para iniciar la actividad 'B' de la actividad 'A' utilizar el método startActivityForResult de la siguiente manera:

 Intent intent2 = new Intent(A.this,B.class); 
     startActivityForResult(intent2,2); 

En lugar de 2 se puede utilizar cualquier número.

Implementar siguiente método para atrapar el resultado de la actividad del niño:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == 2) { 
     finish(); 
    } 
} 

no olvide utilizar mismo número que utilizó al iniciar la actividad.

Ahora en la actividad 'B' haga lo siguiente: Para iniciar la actividad 'C'

 Intent intent3 = new Intent(B.this,C.class); 
    startActivityForResult(intent3,3); 

implementar el método

actividad
 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == 3) { 
         setResult(2); 
     finish(); 
    } 
} 

Aquí está terminando 'A' mediante el establecimiento de resultado como 2 Por lo tanto, la actividad de acabado 'B' también finaliza la actividad 'A'.

Y poner la línea follwing en la actividad 'C':

   setResult(3); 

Tan pronto como su actividad se inicia 'C', sus actividades anteriores están acabados.

Así que el respaldo de la actividad 'C' en realidad cierra la aplicación.

3

No hice nada de esto. Así es como revisaría tu código.

el código que se utiliza para entrar en otra intención:

Intent whatEverIntentName = new Intent("Path.to.next.Intent"); 
startActivity(whatEverIntentName); 
finish(); 

De esta manera, siempre dejar de fumar cuando se presiona hacia atrás. ¡Pero espera! Puede cambiar la forma en que desea que su tecla Atrás presione para reaccionar cuando se presiona.

hacer esto:

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
    Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it"); 
    startActivity(whatEverIntentName); 
// Don't add finish here. 
//This is necessary because you finished your last activity with finish(); 
} 
2

probar esto

Intent intent = new Intent(Intent.ACTION_MAIN); 
    intent.addCategory(Intent.CATEGORY_HOME); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent);     
+0

¿Hay alguna desventaja en usar el mismo ...? Por favor hagamelo saber. – AndroidHacker

1
Intent intent=new Intent(ActivityB.this, ActivityC.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(intent); 

su actividad de C tendrán la actividad de las raíces y de prensa posterior terminarán las aplicaciones.

1

Desde la pantalla (B) que desea iniciar la pantalla (C) sin pantalla hacia atrás, justo iniciar esta pantalla (C) con:

screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
    | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(screenC); 
finish(); 

La parte posterior de screenC saldrá de la aplicación.

3

Nada de eso funcionó para mí. Entonces descubrí una solución. La ayuda muestra claramente que Intent.FLAG_ACTIVITY_CLEAR_TASK se debe usar con Intent.FLAG_ACTIVITY_NEW_TASK. Así que aquí hay un código que funcionó para mí.

Intent intent=new Intent(ActivityB.this, ActivityC.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent); 
1

de la actividad A, empezar la actividad B para un resultado usando startActivityForResult (intención, 19)

En la Actividad B, cuando el usuario activa Actividad C, inicie la actividad C.

startActivity() devuelve de inmediato, por lo

establecer un resultado que le informará de A a terminar así,

acabado de llamadas() en B. y el método de llamada setResult() método antes de acabado() en su actividad infantil En la actividad primaria se reemplaza el método de actividad activa (....). Cuando A recibe ese resultado de B, A también llama a finish() sobre sí mismo.

enter code here 
    @Override 
protected void onActivityResult(int arg0, int arg1, Intent arg2) { 
    //Added by Ashish to close parent activity 
     if(arg1==19){ 
     finish(); 
     } 
    super.onActivityResult(arg0, arg1, arg2); 
} 
2

si está en Actividad A y empezar otra actividad denominada Actividad B. Actividad A -> B Actividad

Y ahora quiere cerrar ambas actividades.

a continuación, utilizar el código de abajo en la actividad B.

B.this.finish(); 

Utilizando este código en la Actividad A:

startActivity(new Intent(A.this, B.class)); 
finish(); 

Tan pronto como la actividad B terminará, Actividad A también terminará.

Hay un inconveniente, no sé si puede querer esto o no.

El inconveniente es que si el usuario está en la Actividad B y presiona el botón Atrás para avanzar en la Actividad A. Luego, la Actividad A también finalizará en este caso.

0

El siguiente código debería hacerlo por usted. Casi en todos los otros enfoques su aplicación permanecerá en aplicaciones recientes. Javadoc se puede encontrar en, https://developer.android.com/reference/android/app/ActivityManager.AppTask.html#finishAndRemoveTask()

  ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
      if(am != null) { 
       List<ActivityManager.AppTask> tasks = am.getAppTasks(); 
       if (tasks != null) { 
        tasks.get(0).finishAndRemoveTask(); 
       } 
      } 
0

Puede utilizar finishAffinity(), se va a cerrar todas las actividades actuales & Padres de la actividad actual.

Nota: Pero no se manejará ningún resultado de Actividad infantil a Actividad principal.

Espero que ayude !!

Cuestiones relacionadas