2014-06-25 12 views
6

Jak wykonać kod przy wyjściu aplikacji? Chcę usunąć dane tymczasowe po zamknięciu aplikacji. Przy wyjściu z aplikacji mam na myśli to, że aplikacja nie jest uruchomiona w tle i całkowicie zniknęła.Jak wykrywać wyjście aplikacji na Androida?

Próbowałem wykonać usługę, która działa w oddzielnym procesie, usługa sprawdza, czy proces aplikacji nie działa, powinien usunąć folder tymczasowy. Dzięki temu folderowi Temporary temp nie zawsze jest usuwany, ponieważ proces nadal działa z najniższym priorytetem.

Nie mogę tego zrobić w OnDestroy().

Kod serwisowy:

[Service(Process = "com.lobomonitor")] 
[IntentFilter(new string[] { "com.androidgui.ProcessMonitorService" })] 
public class ProcessMonitorService : Service 
{ 
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     Thread processThread = new Thread(() => 
              { 
               ActivityManager actManager = (ActivityManager) this.GetSystemService(ActivityService); 
               while (true) 
               { 
                Thread.Sleep(1000); 
                IList<ActivityManager.RunningAppProcessInfo> procList = actManager.RunningAppProcesses; 
                procList.Any(i => i.ProcessName.Equals("com.androidgui")); 
                if (!procList.Any(i => i.ProcessName.Equals("com.androidgui"))) 
                { 
                  FolderManager.Singleton.DeleteTempFolder(); 
                  break; 
                } 
               } 
              }); 
     processThread.Start(); 
     return StartCommandResult.RedeliverIntent; 
    } 

    public override IBinder OnBind(Intent intent) 
    { 
     return null; 
    } 
} 
+0

http://stackoverflow.com/questions/16298795/is-it-possible-to-detect-exit-of-an-application –

+1

http://stackoverflow.com/questions/6682792/android-can-i -detect-użytkownika-ma-left-the-app –

+0

Cykl życia aplikacji jest zarządzany przez system operacyjny Android, myślę, że nie można go wykryć. http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon – naveejr

Odpowiedz

11

ja nie wiem, czy to pomoc, ale jeśli zabijesz swoją aplikację, a następnie serwis, który działa w tle wywołuje metodę:

@Override 
public void onTaskRemoved(Intent rootIntent){ 

    super.onTaskRemoved(rootIntent); 
} 

Na przykład miałem raz aplikacja, która była uruchomiona. Kiedy zabiłem aplikację - usługa również umarła, ale chciałem, aby pozostała przy życiu. Dzięki zastosowaniu onTaskRemoved byłem w stanie zaplanować restartu usługi:

@Override 
public void onTaskRemoved(Intent rootIntent){ 
    Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass()); 
    restartServiceIntent.setPackage(getPackageName()); 

    PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT); 
    AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); 
    alarmService.set(
      AlarmManager.ELAPSED_REALTIME, 
      SystemClock.elapsedRealtime() + 1000, 
      restartServicePendingIntent); 

    super.onTaskRemoved(rootIntent); 
} 

Efekt był -> Ja zabija moją aplikację -> Usługi zobaczyć, że zadania są usuwane i wzywa onTaskRemoved -> Ja planowania restart usług w 1 sec -> Service dies -> Po jednej sekundzie się budzi -> RESULT: Aplikacja została zabita, wykonałem kod, który zrestartował moją usługę, więc nadal działa w tle (widoczne tylko w preferencjach -> aplikacje jako proces)

http://developer.android.com/reference/android/app/Service.html

void  onTaskRemoved(Intent rootIntent) 

T jego jest wywoływana, jeśli usługa jest aktualnie uruchomiona, a użytkownik usunął zadanie, które pochodzi z aplikacji usługi.

+0

Dziękuję. Takie zachowanie chciałem. Właśnie nazwałem FolderManager.Singleton.DeleteTempFolder(); w OnTaskRemoved(). – Xzil0

+0

Dziękuję, szukałem czegoś takiego – takluiper

1

Moje doświadczenie pokazuje, że większość aplikacji naprawdę nie potrzebuje wyjścia-wywołania zwrotnego opisanego przez ciebie rodzaju .

Sposób działania systemu Android, który zwykle działa prawidłowo, obejmuje zarządzanie cyklem życia komponentów na poziomie komponentu (Activity, Service ..) .

Niektóre aplikacje umożliwiają korzystanie z funkcji "Wyjście" (za pomocą przycisku, menu itp.), Która po aktywowaniu przez użytkownika, , pozwala aplikacji zamknąć wszystkie otwarte komponenty i zasadniczo zejść.

Ale jeśli exit-zwrotna jest naprawdę to, co chcesz, najbliższa rzecz do niego prawdopodobnie być stworzenie dedykowanego serwisu bez logiki innej niż onDestroy() Funkcja i aktywować go w aplikacji starcie nigdy nie zamykając to!

class ExitListenerService extends Service { 
    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     // App exit logic here. Not deterministic! 
    }  
} 

Szanse są takie usługi będzie prawdopodobnie ostatni komponent być odzyskane przez system operacyjnego. To powinno w większości przypadków zadziałać. Ale nie jest to gwarantowane w 100%.

Ale jeśli musisz mieć rozwiązanie zabezpieczające przed kulami, jedynym innym sposobem, jaki znam, jest stworzenie aplikacji równorzędnej, nazywam ją stróżem, który będzie okresowo budził się, aby sprawdzić pogodę, lub nie działa główna aplikacja . , jeśli nie działa, aktywuje logikę wyjścia.

Aby uruchomić ten ostatni sprawdzić trzeba będzie zadzwonić

List<RunningAppProcessInfo> runningApps = activityManager.getRunningAppProcesses(); 

i iteracyjne nad runningApps patrząc na własną rękę.

Powiązane problemy