Si mi aplicación se está ejecutando y presiono el botón de inicio, la aplicación pasa a segundo plano. Ahora, si mantienes presionado el botón de inicio y matas la aplicación deslizándola desde la lista de aplicaciones recientes, ninguno de los eventos como onPause()
, onStop()
o onDestroy()
es llamado, el proceso finaliza. Entonces, si quiero que mis servicios se detengan, eliminen las notificaciones y anulen el registro de los oyentes, ¿cómo puedo hacerlo? Leí bastantes artículos y blogs, pero no obtuve ninguna información útil y no encontré ninguna documentación al respecto. Cualquier ayuda sería apreciada. Gracias por adelantado.
104
Respuestas:
Acabo de resolver un problema similar.
Esto es lo que puede hacer si solo se trata de detener el servicio cuando la aplicación se mata al deslizar el dedo desde la lista de aplicaciones recientes.
Dentro de su archivo de manifiesto, mantenga la bandera
stopWithTask
comotrue
para Servicio. Me gusta:Pero como dice que desea anular el registro de los oyentes y detener la notificación, etc., sugeriría este enfoque:
Dentro de su archivo de manifiesto, mantenga la bandera
stopWithTask
comofalse
para Servicio. Me gusta:Ahora a su
MyService
servicio, método de anulaciónonTaskRemoved
. (Esto se disparará solo sistopWithTask
está configurado enfalse
).Consulte mi pregunta para obtener más detalles, que también contiene otra parte del código.
Espero que esto ayude.
fuente
Encontré una forma de hacer esto
hacer un servicio como este
}
2) registre este servicio en manifest.xml
3) Luego inicie este servicio en su actividad de bienvenida
Y ahora, cada vez que borre su aplicación de Android reciente, se ejecutará este método onTaskRemoved ().
fuente
Resolví un problema similar. Si desea que después de deslizar el dedo desde una tarea reciente y en el próximo lanzamiento, se comporte correctamente, siga los pasos a continuación:
1) Guarde el ID del proceso en preferencia compartida:
SharedPreferencesUtils.getInstance().putInt(SharedPreferencesUtils.APP_PROCESS_ID, android.os.Process.myPid());
2) Cuando la aplicación se inicia desde el iniciador después de borrar la tarea reciente, haga lo siguiente:
fuente
Cuando presiona Inicio,
onPause
yonStop
se está llamando a su Actividad, por lo que en este momento debe hacer todos los ahorros y la limpieza, porque la plataforma Android no garantiza queonDestroy
se invoque o cualquier otro método del ciclo de vida, por lo que el proceso podría ser eliminado sin ninguna notificación.fuente
onPause()
yonstop()
deben eliminarse solo cuando el usuario sale de la aplicación, es decir, cierra la sesión.Necesita guardar sus datos cuando
onPause()
se llama a. Mira este diagrama de ciclo de vida: Desarrollador de AndroidPuede ver que una aplicación se puede eliminar después de
onPause()
oonStop()
.Maneje sus datos allí y recupérelos en
onRestart()
\onCreate()
.¡buena suerte!
fuente
No puede manejar el deslizamiento, porque el sistema simplemente elimina su proceso de la memoria sin llamar a ninguna devolución de llamada.
He comprobado que antes de que el usuario llame a la pantalla de "aplicaciones recientes", siempre se llamará a onPause (). Por lo tanto, debe guardar todos los datos en el método onPause sin marcar isFinishing ().
Para comprobar el botón de retroceso, utilice el método onBackPressed.
fuente
ViewModel.onCleared () puede ser útil si el objetivo es liberar algún recurso (tal vez un sistema que se ejecuta en otro lugar de la red) cuando el usuario ejecuta una salida sorpresa deslizando el dedo, en lugar de presionar el botón "detener". [Así es como llegué originalmente a esta pregunta].
La aplicación no recibe una notificación y Activity.onDestroy () recibe una llamada para cambios de configuración, como cambios en la orientación, por lo que la respuesta no está ahí. Pero se llama a ViewModel.onCleared cuando la Aplicación se elimina (así como cuando el usuario se retira de la actividad). Si el recurso que desea usar está asociado con más de una actividad en la pila, puede agregar recuentos de referencias o algún otro mecanismo para decidir si ViewModel.onClear debería liberar el recurso.
Esta es otra de las muchas buenas razones para usar ViewModel.
-- Beto
fuente
Realmente no sé por qué los enfoques anteriores no funcionan en mi caso, incluso si configuré
android:stopWithTask="false"
queonTaskRemoved()
no se llamó.Otro buen enfoque sería utilizar
AndroidViewModel
. Este incluso funciona en el caso cuando el usuario sale de la aplicación al presionar el botón Atrás.Simplemente vincule la
ViewModel
clase a su yMainActivity
luego haga suonCleared()
devolución de llamada de tarea .Ejemplo:
luego vincúlelo a su MainActivity:
~ ¡Voila!
fuente
Esto funcionó para mí en Android 6,7,8,9.
Haz un servicio como este:
2) Registre este servicio en
manifest.xml
:3) Luego inicie este servicio en su actividad de bienvenida
fuente
Como Bob Cram mencionó en su respuesta, el método onCleared () de View Model es la respuesta. Funciona en ambos casos:
El servicio onTaskRemoved () funcionará cuando el usuario deslice la aplicación desde el fondo, pero no funcionará cuando las aplicaciones se borren con el botón de matar a todos.
Pero el método onCleared () de viewModel funciona en ambos casos. Puede usar si para detener cualquier proceso en curso o borrar cualquier tarea en el servidor remoto.
fuente