¿Cómo saber cuándo mi aplicación ha sido asesinada?

Necesito saber cuándo el usuario mata mi aplicación (Force stop). He estado leyendo el ciclo de vida de Android, que tiene las onStop() y onDestroy() , estas están relacionadas con cada actividad que el usuario finaliza en mi aplicación, pero no cuando el usuario obliga a detener o a matar mi aplicación.

¿Hay alguna forma de saber cuándo el usuario mata la aplicación?

no hay forma de determinar cuándo se mata un proceso. ¿Cómo detectar si la aplicación de Android se detiene o se desinstala?

Cuando un usuario o la fuerza del sistema detienen su aplicación, todo el proceso simplemente se elimina. No hay callback para informarle que esto ha sucedido.

Cuando el usuario desinstala la aplicación, al principio se cancela el proceso, luego se eliminan el archivo apk y el directorio de datos, junto con los registros en el Administrador de paquetes que indican a otras aplicaciones qué filtros de intención se han registrado.

He encontrado una manera de hacer esto …..

  1. Haz un servicio como este

     public class OnClearFromRecentService extends Service { @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.d("ClearFromRecentService", "Service Started"); return START_NOT_STICKY; } @Override public void onDestroy() { super.onDestroy(); Log.d("ClearFromRecentService", "Service Destroyed"); } @Override public void onTaskRemoved(Intent rootIntent) { Log.e("ClearFromRecentService", "END"); //Code here stopSelf(); } } 
  2. Registre este servicio en Manifest.xml como este

      
  3. Luego, inicie este servicio en su actividad de bienvenida

     startService(new Intent(getBaseContext(), OnClearFromRecentService.class)); 

Y ahora cuando borre su aplicación de Android reciente, entonces se ejecutará este método onTaskRemoved() .

NOTA: En Android O +, esta solución solo funciona cuando la aplicación es a tiempo completo en primer plano. Después de más de 1 minuto con la aplicación en segundo plano, OnClearFromRecentService (y todos los demás servicios en ejecución) serán automáticamente eliminados por el sistema para que no se ejecute onTaskRemoved ().

Crear una clase de aplicación

 onCreate() Called when the application is starting, before any activity, service, or receiver objects (excluding content providers) have been created. onLowMemory() This is called when the overall system is running low on memory, and actively running processes should trim their memory usage. onTerminate() This method is for use in emulated process environments. 

Incluso si tu aplicación es kill o force stop, otra vez Android iniciará tu clase de aplicación

Después de investigar este problema, encontré una solución que podría ayudarte:

Todo lo que necesita hacer es verificar el método onDestroy de su BaseActivity extendido por todas sus actividades, ya sea que la última actividad de la stack sea de su paquete o no con el siguiente código:

 ActivityManager activityManager = (ActivityManager) getSystemService( ACTIVITY_SERVICE ); List taskList = activityManager.getRunningTasks( 10 ); if ( !taskList.isEmpty() ) { ActivityManager.RunningTaskInfo runningTaskInfo = taskList.get( 0 ); if ( runningTaskInfo.topActivity != null && !runningTaskInfo.topActivity.getClassName().contains( "com.my.app.package.name" ) ) { //You are App is being killed so here you can add some code } } 

Siempre puedes usar este código:

 protected void onCreate(Bundle savedInstanceState) { //... Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { @Override public void uncaughtException(Thread thread, Throwable ex) { //inform yourself that the activity unexpectedly stopped //or YourActivity.this.finish(); } }); //... } 

Tengo una idea alternativa. Tengo el mismo problema que tú. Los métodos anteriores no solucionan mi problema: “Quiero borrar toda la información guardada de la aplicación completa, cuando el usuario cierra por completo la aplicación”.

Entonces, agregué clear () y borré los datos guardados (de shared preference o tinyDB) en la clase Application.