2010-06-23 17 views
45

Powiel możliwe:
Quitting an application - is that frowned upon?Jak zabić aplikację ze wszystkimi jej działaniami?

Chcę zaoferować użytkownikowi opcję, aby zamknąć aplikację jak trzeba usunąć kilka poufnych danych, które są przechowywane w SharedPreferences jak długo aplikacja tego potrzebuje.

Gdy użytkownik chce wyjść, hasło w SharedPreferences powinno zostać wyczyszczone i oczywiście wszystkie działania aplikacji powinny zostać zamknięte (nie ma sensu uruchamianie ich bez znanego hasła - powodowałyby awarię).

Jak mogę to zrobić?

System.exit(0) i finish() tylko wyjście z bieżącej działalności - bezużyteczne. Wiem, że istnieje aplikacja menedżera zadań. Jak to się robi? Jest w stanie zabić całą aplikację ...

Odpowiedz

3

Moje zrozumienie struktury aplikacji dla systemu Android jest takie, że jest to zabronione. Aplikacja jest zamykana automatycznie, gdy nie zawiera już bieżących działań. Próba utworzenia przycisku "zabij" jest wyraźnie sprzeczna z zamierzonym projektem systemu aplikacji.

Aby uzyskać pożądany efekt, można zainicjować różne działania za pomocą funkcji startActivityForResult(), a przycisk wyjścia wysłać wynik, który powiedzie, że działanie nadrzędne zakończy(). Ta aktywność może następnie wysłać ten sam wynik, co część onDestroy(), która będzie kaskadować z powrotem do głównego działania i nie będzie wykonywała żadnych czynności, które powinny spowodować zamknięcie aplikacji.

7

który jest przechowywany w SharesPreferences dopóki aplikacja potrzebuje.

Dlaczego?

Gdy tylko użytkownik będzie chciał wyjść, hasło w SharedPreferences należy przetrzeć i oczywiście wszystkie działania aplikacji należy być zamknięty (nie ma sensu biec je bez znany hasło - ulegną one awarii).

Jeszcze lepiej: nie wpisuj hasła w numerze SharedPreferences. Przytrzymaj go w statycznym elemencie danych. Dane znikną w sposób naturalny, gdy wszystkie działania w aplikacji zostaną zakończone (np. Przycisk BACK) lub w inny sposób zostaną zniszczone (np. Wyrzucone z pamięci RAM, aby zrobić miejsce na inne czynności po naciśnięciu klawisza HOME).

Jeśli potrzebujesz jakiegoś proaktywnego "hasła do spłukiwania", po prostu ustaw statyczny element danych na null i wykonaj swoje czynności, sprawdzając tego członka i podejmuj odpowiednie działania, gdy jest to null.

+0

Dzięki. To działało, ale jak tylko wystąpi awaria w jakiejkolwiek działalności i będzie to NULL, nawet inne działania będą nadal obecne. No dobrze ... Domyślam się, że to jest w porządku – Nils

6

Korzystanie onBackPressed() metody:

@Override 
public void onBackPressed() {  
    android.os.Process.killProcess(android.os.Process.myPid()); 
} 

lub użyć metody finish(), mam coś takiego

//Password Error, I call function 
    Quit();    


    protected void Quit() { 
     super.finish(); 
    } 

Z super.finish() ty zamknąć działalność w klasie Super.

+0

TNX dla tego Criss

32

Masz rację: wywołanie finish() spowoduje tylko wyjście z bieżącej aktywności, a nie z całej aplikacji. istnieje jednak obejście tego problemu:

Za każdym razem, gdy rozpoczynasz działanie, uruchom je za pomocą startActivityForResult(...). Kiedy chcesz zamknąć całą aplikację, można zrobić coś takiego:

setResult(RESULT_CLOSE_ALL); 
finish(); 

Następnie zdefiniować każde działanie jest onActivityResult(...) zwrotnego więc gdy aktywność wraca z wartością RESULT_CLOSE_ALL, ale również wywołuje finish():

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch(resultCode) 
    { 
    case RESULT_CLOSE_ALL: 
     setResult(RESULT_CLOSE_ALL); 
     finish(); 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

Spowoduje to efekt kaskady zamykający wszystkie czynności.

Ponadto, wspieram CommonsWare w jego sugestii: przechowuj hasło w zmiennej, aby zostało ono zniszczone po zamknięciu aplikacji.

+0

Bardzo mi pomogło @mtmurdock. Bardzo dziękuję za to rozwiązanie. – praveenb

+0

RESULT_CLOSE_ALL nie może zostać rozwiązany dla zmiennej – hamish

+0

Wyszukałem go i znalazłem kilka osób używających zerowej publicznej końcowej statycznej int RESULT_CLOSE_ALL = 0; – hamish

12

Gdy użytkownik chce zamknąć wszystkie otwarte czynności, powinien nacisnąć przycisk, który ładuje pierwsze działanie uruchamiane podczas uruchamiania aplikacji, w moim przypadku "LoginActivity".

Intent intent = new Intent(getApplicationContext(), LoginActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
intent.putExtra("EXIT", true); 
startActivity(intent); 

Powyższy kod usuwa wszystkie czynności z wyjątkiem funkcji LoginActivity. LoginActivity to pierwsze działanie, które jest wywoływane, gdy użytkownik uruchamia program. Następnie umieść ten kod wewnątrz obiektu onCreate opcji LoginActivity, aby zasygnalizować, kiedy powinien sam się zniszczyć po przekazaniu komunikatu "Wyjście".

if (getIntent().getBooleanExtra("EXIT", false)) { 
     finish(); 
    } 

Odpowiedź dostaniesz na to pytanie z platformy Android to: „Nie rób przycisk exit działalność zakończyć użytkownik nie chce, a menedżer aktywny będzie oczyścić je według własnego uznania.. "

+0

dobre rozwiązanie, ale czy nie jest to obciążenie, aby rozpocząć nowe działanie ... – aProgrammer

+3

Tak, ale pamiętaj, Android bardzo stara się nie dać programistom możliwość tworzenia przycisku "wyjścia" dla swoich aplikacji. Musisz więc oszukać język, aby opuścił aplikację, powoli wkradł się do niego, sprawiając, że myślisz tylko, że chcesz przerwać kilka czynności, a potem podkradając się do ostatecznego polecenia, pozwalając na zakończenie ostatniej czynności. To trochę jak omijanie strażnika przez odwracanie jego uwagi, a potem bieganie, kiedy nie patrzy. –

84

Kiedy używasz metody finish(), nie zamyka ona całkowicie procesu, w dalszym ciągu działa w tle.

Proszę użyć tego kodu w działalność Głównego (Proszę nie używać w każdych działań lub sub Działalności):

@Override 
public void onBackPressed() { 

    android.os.Process.killProcess(android.os.Process.myPid()); 
    // This above line close correctly 
} 
+1

WoW, właściwy kierunek !!! Dziękuję – Ponmalar

+13

To zabije proces, ale niekoniecznie zabije to zadanie w pamięci. Kiedy więc aplikacja zostanie ponownie uruchomiona, stos działań (zadanie) zostanie odtworzony po raz ostatni. –

+4

Tak, nie podoba mi się to rozwiązanie w ogóle. Zabicie procesu usuwa wszelkie możliwości zapisania danych lub zakończenia oczekujących zadań. To jest jak najbardziej bezczelny, jaskiniowy sposób zamykania aplikacji i należy go unikać za wszelką cenę. – mtmurdock

Powiązane problemy