Jak sprawdzić, czy moja aplikacja została zabita?

Muszę wiedzieć, kiedy użytkownik zabije moją aplikację(Force stop). Czytałem cykl życia Androida, który ma funkcje onStop() i onDestroy(), są one związane z każdą aktywnością, którą użytkownik kończy w mojej aplikacji, ale nie wtedy, gdy użytkownik wymusza zatrzymanie lub zabicie mojej aplikacji.

Czy jest jakiś sposób, aby wiedzieć, kiedy użytkownik zabija aplikację?

Author: CopsOnRoad, 2014-01-10

7 answers

Nie ma sposobu, aby określić, kiedy proces zostanie zabity. Z Jak wykryć, czy aplikacja na Androida jest siłą zatrzymana lub odinstalowana?

Gdy użytkownik lub system wymusi zatrzymanie aplikacji, cały Proces jest po prostu zabijany. Nie ma połączenia zwrotnego, aby poinformować Cię, że to się stało.

Gdy użytkownik odinstaluje aplikację, na początku Proces jest zabijany, a następnie Twój plik apk i katalog danych są usuwane wraz z rekordami w menedżerze pakietów które informują inne aplikacje, które filtry intencyjne masz zarejestrowany dla.

 26
Author: Taranfx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Znalazłem na to sposób.....

  1. Zrób jedną usługę w ten sposób

    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. Zarejestruj tę usługę w manifeście.XML jak ten

    <service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
    
  3. Następnie uruchom tę usługę na swojej aktywności splash

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

A teraz, gdy wyczyścisz swoją aplikację z Androida ostatnio, ta metoda onTaskRemoved() zostanie uruchomiona.

Uwaga: W Androidzie o+ to rozwiązanie działa tylko wtedy, gdy aplikacja jest w pełnym wymiarze czasu na pierwszym planie. Po więcej niż 1 Minuta z aplikacją w tle, OnClearFromRecentService (i wszystkie inne uruchomione usługi) zostanie automatycznie zabity siłą przez system, więc onTaskRemoved () nie zostanie wykonany.

 137
Author: Faisal Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 12:44:17

Tworzenie klasy aplikacji

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.

Nawet jeśli aplikacja została zabita lub zatrzymana na siłę, Android ponownie uruchomi klasę aplikacji

 5
Author: rajahsekar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-10 09:26:32

Po zagłębianiu się w ten problem znalazłem rozwiązanie, które może Ci pomóc:

Wszystko, co musisz zrobić, to sprawdzić na metodzie onDestroy swojej BaseActivity, która jest rozszerzona o wszystkie Twoje działania, czy ostatnia uruchomiona aktywność stosu pochodzi z twojego pakietu, czy nie za pomocą następującego kodu:

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
         }
    }
 0
Author: Santiago Carrillo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-25 13:13:38

To może pomóc wielu, którzy chcą wiedzieć, czy aplikacja jest zakończona, czy nie Najlepszym sposobem jest przechowywanie danych w jednej zmiennej statycznej dla NP: public static string IsAppAvailable;

Specjalnością zmiennej statycznej jest to, że dane w zmiennej statycznej zawierają aż aplikacja znajduje się na pierwszym planie lub w tle, po zabiciu aplikacji dane w zmiennej statycznej są usuwane. Zasadniczo zmienna statyczna jest ponownie uruchamiana, gdy aplikacja jest świeżo utworzona

Utwórz jeden statyczny plik klasy Const

namespace YourProject
{
    public static class Const
    {
        public static string IsAppAvailable;
     }
}

In Main

   protected override void OnResume()
    {
       if(string.IsNullOrWhiteSpace(Const.IsAppAvailable))
       {
          //Your app was terminated
       }
       Const.IsAppAvailable = "Available" 
    }

Mam nadzieję, że jest to pomocne dla programistów :) Happy coding

 0
Author: Sonali Rane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-30 08:58:01

W niektórych przypadkach można utworzyć stronę ekranu powitalnego, aby określić, czy aplikacja została wcześniej zabita przez system.

To w zasadzie ekran z filtrem intencyjnym main / launcher i zostanie zakończony, i zmienione na główną aktywność.

Tak więc, za każdym razem, gdy użytkownik odwiedza splashScreen, pokazuje, że aplikacja została zabita wcześniej, i możesz zrobić wszystko, co chcesz obsłużyć.

 0
Author: nashihu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-28 11:55:54

Mam inny pomysł.mam taki sam problem jak ty.powyższe metody nie fix.my problem : "chcę wyczyścić wszystkie zapisane dane w całej aplikacji, gdy użytkownik całkowicie zamknie aplikację"

Dodałem więc clear () & clear zapisane dane (z shared preference lub tinyDB) do klasy aplikacji.

 -4
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 09:23:24