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ę?
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.
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.....
-
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(); } }
-
Zarejestruj tę usługę w manifeście.XML jak ten
<service android:name="com.example.OnClearFromRecentService" android:stopWithTask="false" />
-
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.
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
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
}
}
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
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ć.
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.