android activity - Come sapere quando la mia app è stata uccisa?




guide get (6)

non c'è modo di determinare quando un processo viene ucciso. Da Come rilevare se l'app Android viene forzata arrestata o disinstallata?

Quando un utente o il sistema forza la tua applicazione, l'intero processo viene semplicemente ucciso. Non vi è alcuna richiamata per informarvi che questo è successo.

Quando l'utente disinstalla l'app, in un primo momento il processo viene eliminato, quindi il file apk e la directory dei dati vengono eliminati, insieme ai record in Package Manager che indicano ad altre app quali filtri di intent sono stati registrati.

Devo sapere quando l'utente uccide la mia app (arresto forzato). Ho letto il ciclo di vita di Android, che ha le onStop() e onDestroy() , queste sono legate a ciascuna attività che l'utente termina sulla mia app, ma non quando l'utente impone di interrompere o uccidere la mia app.

C'è un modo per sapere quando l'utente uccide l'app?


Ho trovato un modo per farlo .....

  1. Fai un servizio come questo

    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. Registra questo servizio in Manifest.xml come questo

    <service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
    
  3. Quindi avvia questo servizio sulla tua attività splash

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

E ora ogni volta che cancellerai la tua app da Android recente. Quindi questo metodo onTaskRemoved() verrà eseguito.

NOTA: in Android O + questa soluzione funziona solo quando l'app è a tempo pieno in primo piano. Dopo più di 1 minuto con l'app in background, OnClearFromRecentService (e tutti gli altri servizi in esecuzione) verranno automaticamente forzati dal sistema in modo che onTaskRemoved () non venga eseguito.


Crea una classe di applicazione

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.

Anche se sei stato sottoposto all'applicazione Killed o Force Stop, ancora una volta Android avvierà la tua classe Application


Ho un'idea alternativa. Ho lo stesso problema come te.verso i metodi non fix.my problema: "Voglio cancellare tutti i dati salvati l'intera app, quando l'utente chiude completamente l'app"

Quindi, ho aggiunto clear () e cancella i dati salvati (dalla preferenza condivisa o tinyDB) nella classe Application.


Dopo aver analizzato questo problema, ho trovato una soluzione che potrebbe aiutarti:

Tutto quello che devi fare è controllare il metodo onDestroy di BaseActivity che viene esteso da tutte le tue attività, sia che l'ultima attività in esecuzione dello stack provenga dal tuo pacchetto o meno con il seguente codice:

ActivityManager activityManager = (ActivityManager) getSystemService( ACTIVITY_SERVICE );

List<ActivityManager.RunningTaskInfo> 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
         }
    }

Avevo questo problema qualche volta, la soluzione era cambiare il cavo USB in uno nuovo





android android-lifecycle