2011-01-24 13 views
29

Mam aktywność, która po uruchomieniu ładuje obraz z Internetu. W celu zaoszczędzenia pamięci, gdy Aktywność jest pozostawiona przez naciśnięcie przycisku Wstecz, chcę, aby aktywność zrzuciła wszystkie dane, czyli pozbyć się wszystkich ciągów i obrazów, które są w nim. Pomyślałem, że najlepszym sposobem, aby to zrobić, jest po prostu zabicie działalności.Jak zabić działanie po naciśnięciu przycisku Wstecz?

Cóż, nie mogę znaleźć odpowiedzi na wezwanie po naciśnięciu przycisku Wstecz. Tak, próbuję użyć wywołań zwrotnych onPause() i onStop() dla zadania, ale obie strony wymuszają zamknięcie mojej aplikacji. Oto kod:

public void onPause() { 
    this.finish(); 
} 
public void onStop() { 
    finish(); 
} 

Próbowałem wielu odmian tego, ale żaden z nich nie działał. Jakieś pomysły?

+0

czego dokładnie szukasz ?, aby zakończyć bieżącą aktywność z powrotem? Button –

Odpowiedz

36

dodać do swojej działalności

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    { 
     finish(); 
    } 
    return super.onKeyDown(keyCode, event); 
} 
+1

O co ci chodzi? Naciśnięcie przycisku Wstecz spowoduje automatyczne przejście do stosu działań. 'finish()' po prostu upewnia się, że nie możesz wrócić. (To powiedziawszy, pytanie jest wprawdzie niejasne.) – EboMike

+2

oczywiście, ale aktywność jest zabijana nie jest pewna po naciśnięciu przycisku powrotu, więc zabicie zakończenia jest ważne i to jest to, o co pytano, ale ponieważ zwolnienie pamięci kończy się automatycznie przez OS – ingsaurabh

+2

Absolutnie nie. Jeśli działanie nie jest z przodu, może zostać odzyskane przez system operacyjny. Zakończone lub nie. – EboMike

4

Cóż, jeśli badanie struktury, jak działa aplikacja cyklu życia, here, wtedy przyjdzie wiedzieć, że onPause() jest wywoływana, gdy inny zyski działalność koncentruje i onStop() jest wywoływana, gdy działanie nie jest już widoczne.

Z czego nauczyli się jeszcze, można zadzwonić finish() tylko z działalności, który jest aktywny i/lub ma ostrość. Jeśli dzwonisz pod numer finish() z metody onPause(), oznacza to, że wywołujesz ją, gdy działanie nie jest już aktywne. w ten sposób generowany jest wyjątek.

Podczas wywoływania finish() z onStop() to działanie jest wysyłane do tła, więc nie będzie już widoczne, a następnie ten wyjątek.

Po naciśnięciu przycisku back zostaje wywołany onStop().

Najprawdopodobniej system Android automatycznie wykona dla Ciebie to, co aktualnie chcesz zrobić.

6

Po pierwsze, finish() nie niszczy procesu i nie zwalnia pamięci. Po prostu usuwa aktywność ze stosu działań. Musisz zabić proces, na który odpowiedziano w kilku pytaniach (ponieważ jest to zadawane kilka razy).

Ale właściwą odpowiedzią jest - Nie rób tego. system operacyjny Android automatycznie zwolni pamięć, gdy będzie potrzebować pamięci. Nie zwalniając pamięci, aplikacja uruchomi się szybciej, jeśli użytkownik wróci do niej.

Proszę see here za świetny artykuł na ten temat.

+7

Jeśli aktywność wykorzystuje dużo zasobów, to dlaczego nie zabić jej z wnętrza aplikacji, a nie czekać na GC? To jest cały proces, który musiałby przejść, a więc spowalniać telefon. Dobre zarządzanie pamięcią podejmuje każdą próbę zarządzania nią w ramach samego programu. To dlatego większość zarządzanych języków programowania i ide automatycznie umieszcza kod samoczyszczenia w programie, a także powód, dla którego nadajesz cykl życia, dzięki czemu możesz zarządzać pamięcią najlepiej, jak potrafisz, z poziomu aplikacji. – Shaun

+1

Shaun ma rację, dobre zarządzanie pamięcią podejmuje każdą próbę zarządzania nim w ramach samego programu. – dns

61

Proste Zastąp onBackPressed metoda:

@Override 
    public void onBackPressed() { 
      super.onBackPressed(); 
      this.finish(); 
    } 
13
public boolean onKeyDown(int keycode, KeyEvent event) { 
    if (keycode == KeyEvent.KEYCODE_BACK) { 
     moveTaskToBack(true); 
    } 
    return super.onKeyDown(keycode, event); 
} 

Moja aplikacja zamknięte z powyższym kodzie.

+0

to działa, dziękuję – Mohsen

+0

jego działanie, ale aplikacja jest otwarta ta sama strona zawsze, gdy aplikacja nie jest zabity –

+0

, ale chcesz uruchomić aplikację w aktywowalności Launchera –

Powiązane problemy