restaurar - mantener aplicaciones en segundo plano android
Cerrar la aplicación y eliminar de las aplicaciones recientes/ (5)
Agregue esto a su actividad:
@Override
public void finish() {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
super.finishAndRemoveTask();
}
else {
super.finish();
}
}
Llame a esto cuando haya terminado su actividad y debe cerrarse y la tarea debe eliminarse por completo como parte de la finalización de la actividad raíz de la tarea.
Sé que esta pregunta es común y se hace muchas veces en Stack Overflow, pero después de visitar casi las cuatro páginas de resultados del motor de búsqueda y casi la pregunta 20 de Stack Overflow con respecto a este problema, encontré que ninguna de ellas se resolvió o respondió correctamente.
Lo que quiero:
Quiero mostrar mi aplicación en la lista de aplicaciones recientes cuando se está ejecutando, pero cuando la cierro, mi proceso debería eliminarse y la aplicación debería eliminarse de la lista de aplicaciones recientes.
Algunas respuestas que encontré:
use System.exit(0); //doesn''t clear app from recents
OR
use android.os.Process.killProcess(android.os.Process.myPid()); //doesn''t clear app from recents
OR
use finish() or this.finish() or Activity.finish();// doesn''t clear app from recents
Y una sugerencia común que veo en cada respuesta que agrega el código siguiente en el manifiesto:
android:excludeFromRecents //I think this is wrong approach.
porque después de agregar esto cuando el usuario presiona el botón de inicio mientras mi aplicación se está ejecutando, el usuario no puede ver mi aplicación en la Lista de aplicaciones recientes.
Y muchas otras sugerencias sobre esto, pero ninguna de ellas hace que ambas tareas cierren la aplicación y borren la aplicación de la lista de aplicaciones recientes. Además, si Settings>Apps>yourApp>your Application
verás que todavía pide "forzar parada" significa que la aplicación se está ejecutando.
Antes de presentar mi intento, quiero dejar claro que lo que sigue no abordará la disponibilidad de "forzar la detención" en la información de la aplicación. Android le permite forzar la detención de una aplicación incluso si no tiene ningún proceso en ejecución. Forzar la detención pone el paquete en un estado de detención específico, donde no puede recibir eventos de transmisión.
Ahora que está fuera de lugar, con mi idea cursi para esto. Lo esencial es reemplazar la tarea que desea salir con una que el sistema excluirá de la lista de aplicaciones recientes.
- Defina una actividad (la llamaré
Exiter
) que acaba de completarse inmediatamente.- Llame a
finish()
enonCreate(Bundle)
. - A partir de la pregunta, parece que el OP también querrá llamar a
System.exit(int)
también. Pero para otras personas que leen esta respuesta, normalmente no tienes que matar el proceso. - Use
android:theme="@android:style/Theme.NoDisplay"
para evitar que esto provoque un montón de transiciones redundantes.
- Llame a
- Establezca
android:taskAffinity
para queExiter
se ejecute en la tarea que desea salir. O no: de forma predeterminada,taskAffinity
no especificado hace que todas las actividades compartan untaskAffinity
anónimo común. - Cuando quiera salir, use
startActivity(Intent)
para iniciarExiter
con las siguientes banderas:-
Intent.FLAG_ACTIVITY_NEW_TASK
: aunque deseamos iniciar la actividad en la misma tarea, los otros indicadores requieren este indicador. Afortunadamente,taskAffinity
evitará que el sistema inicie una nueva tarea. -
Intent.FLAG_ACTIVITY_CLEAR_TASK
: esto finaliza todas las actividades de la tarea. No tendrás que llamar afinish()
todas partes, solo enExiter
. -
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- La tarea no estará en la lista de aplicaciones recientes. Dado que es la misma tarea que la que está saliendo, esta marca elimina la tarea de la lista.
-
Basé mi solución en los comentarios de los huéspedes anteriores, así como en los comentarios de gilsaints88 a continuación (para compatibilidad con Android L):
Agrega esta actividad a tu archivo AndroidManifest.xml:
<activity
android:name="com.example.ExitActivity"
android:theme="@android:style/Theme.NoDisplay"
android:autoRemoveFromRecents="true"/>
Luego crea una clase ExitActivity.java:
public class ExitActivity extends Activity
{
@Override protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if(android.os.Build.VERSION.SDK_INT >= 21)
{
finishAndRemoveTask();
}
else
{
finish();
}
}
public static void exitApplication(Context context)
{
Intent intent = new Intent(context, ExitActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
}
Luego, cuando quiera forzar el cierre de su aplicación y eliminarla de la lista del reciente, llame al:
ExitActivity.exitApplication(context);
Esta solución funciona para mí en lugar de declarar android: excludeFromRecents = "true" porque quiero que el usuario pueda ver la aplicación en la lista de los últimos hasta el punto en que mi aplicación activa el cierre programático de la aplicación.
La solución para Kotlin.
ExitHelper.kt
fun Activity.finishAndRemoveTaskCompat() {
if (android.os.Build.VERSION.SDK_INT >= 21) {
finishAndRemoveTask()
} else {
val intent = Intent(this, ExitAndRemoveFromRecentAppsDummyActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or
Intent.FLAG_ACTIVITY_CLEAR_TASK or
Intent.FLAG_ACTIVITY_NO_ANIMATION or
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
startActivity(intent)
}
}
class ExitAndRemoveFromRecentAppsDummyActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
finish()
}
}
AndroidManifest.xml
<activity
android:name=".ExitAndRemoveFromRecentAppsDummyActivity"
android:theme="@android:style/Theme.NoDisplay"
/>
Entonces solo úselo como un método habitual en su actividad:
override fun boo() {
foo()
finishAndRemoveTaskCompat()
}
finishAndRemoveTask();
Trabajó para que elimine una aplicación de la barra de tareas. Después de cerrar la aplicación.