Pregunta

Tengo una aplicación con varias actividades en Android y quiero que el usuario sea capaz de conectarse de salida pulsando un botón de menú. El problema que tengo es que

A) Android no permite que usted termina la aplicación y
B) aun cuando envío al usuario de la LoginActivity nuevo que siempre puede pulsar Atrás y volver derecho a la actividad anterior que se encontraban.

Ya trató de poner en marcha la actividad con las dos banderas siguientes:

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

También probé con cada uno de ellos por sí mismos.

También he intentado llamar finish() después startActivity(intent) como he leído en otro Stackoverflow cuestión.

¿Fue útil?

Solución

En su actividad de inicio de sesión, anular el botón de retroceso, por lo que esconde su aplicación en lugar de terminar la actividad:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

También asegúrese de ajustar Android:. AlwaysRetainTaskState = "true" en la actividad de las raíces, por lo que Android no borra su pila (incluida la actividad de inicio de sesión) después de 30 minutos de inactividad del usuario

A continuación, sólo llamar acabado () cuando hay una conexión exitosa.

Otros consejos

Esto debería ser a nivel de bits es OR o terminar sobrescribir la bandera anterior.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Al igual que:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Según Wakka en Extracción de una actividad a partir de la historia de pila ...


Añadir atributo android:noHistory="true" a su <activity> en el AndroidManifest.xml como esto:

<activity android:name=".MyActivity"
    android:noHistory="true">
</activity>

Si está utilizando Android API 11 o superior, puede utilizar el siguiente código para borrar la pila.

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Esta wont despejar su stack actividad.

Incluso después de seguir toda la respuesta anterior, cuando apreté el botón de retroceso Mostró la última actividad por un segundo antes de cerrar la aplicación.

Esto es lo que hice:

@Override
public void onBackPressed() { 
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(startMain);
}

Ahora mi aplicación salidas en prensa posterior :) sin ningún tipo de molestia.

Configuración Intent.FLAG_ACTIVITY_CLEAR_TOP ha trabajado para mí en un caso muy similar, en el que no fija la bandera Intent.FLAG_ACTIVITY_NEW_TASK. ¿Usted ha intentado sin?

Este trabajo para mí:)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

Donde A es mi actividad de las raíces, por ejemplo,

Tengo actividades A -> B -> C -> D cuando llamo iniciar la actividad E en la pila tengo ahora A -> E

No sé que es bueno :) pero las obras.

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

escribir esto y nota: LoginActivity debe ser lanzado por primera vez como lanzador y

si escribe cualquiera de los modos de lanzadores las banderas se sobreescriben su propósito, por lo que eliminar el launchermode y tratar seguramente lo conseguirá

Probar

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Si utilizamos este código para iniciar actividad de inicio de sesión (A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

La actividad debe estar en la pila de actividades, de lo contrario este banderas no tendrán ningún efecto.

Si usamos acabado () en la actividad de inicio de sesión (A), después del lanzamiento de la actividad (B) (para evitar volver a ir A de B), la actividad A (Entrar) no estará en la pila. Exactamente lo mismo sucede cuando la actividad de inicio de sesión tiene "noHistory" como atributo.

Por lo tanto, la solución para mí fue una mezcla de otras respuestas:

Este código va en la actividad B, para evitar volver a la actividad de inicio de sesión:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}

Y este código va en la actividad que llame a la función de cierre de sesión:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top