2011-07-22 10 views
15

Teraz aktywność zostaje zniszczona po naciśnięciu klawisza WSTECZ. Jak mogę go zatrzymać (np. Utrzymać przy życiu wszystkie zmienne itd.), A następnie zniszczyć?Jak sprawić, aby działanie przestało działać, a następnie zostało zniszczone z klawisza WSTECZ?

Dzięki!

+0

http: // stackoverflow.com/questions/3141996/android-how-to-override-the-back-button-so-it-doesnt-finish-my-activity –

+0

Podobny, ale uruchamia główną czynność po naciśnięciu klawisza wstecz. Muszę po prostu przestać (tzn. Wstrzymać i przejść do tła, aby powrócić do poprzedniej aktywności). – Roger

+0

Co/ile zmiennych? Jak są używane? Można rozważyć ustawienie ich jako zmiennych klasowych zamiast martwić się utrzymaniem tej aktywności przy życiu. – Rob

Odpowiedz

13

Dlaczego konieczne jest utrzymanie zmiennych przy życiu? Biorąc pod uwagę ustalony cykl życia aplikacji na Androida, nie jestem pewien, czy zapobieganie niszczeniu aktywności "tylko po to, aby zachować zmienne" ma sens.

  1. Nawet jeśli zatrzymać aplikację, nie niszcząc go, zawsze jest szansa, że ​​Android będzie go zabić, aby zwolnić pamięć. Będziesz musiał to uwzględnić w swoim kodzie, a więc zapobieganie niszczeniu aplikacji nie uchroni Cię przed pisaniem kodu.

  2. Zmienne można zapisywać i przywracać stosunkowo łatwo i szybko za pomocą SharedPreferences w metodach onPause() i onResume(). Jeśli nie przechowujesz mnóstwa danych, zapobieganie niszczeniu aplikacji może nie zrobić dużej różnicy.

  3. Wygląda na to, że chcesz zachować zmienne w pamięci, ponieważ zamierzasz powrócić do tej czynności. Zazwyczaj nie używasz przycisku Wstecz, aby odejść od działań, do których zamierzasz wrócić. Zamiast tego utworzysz intencję i rozpoczniesz nową aktywność. Kiedy to zrobisz, Android umieszcza bieżącą aktywność w Back Stack, wywołując onPause() i onStop(), co wydaje się dokładnie takim rodzajem zachowania, którego szukasz.

Więc jeśli wciąż naprawdę chcą zapobiec swoją aktywność przed zniszczeniem (przynajmniej dopóki Android decyduje to zużywa zbyt dużo pamięci i zabija go na swój własny) zawsze można użyć kodu Sagar i rozpocząć nową działalność w onBackPressed().

@Override 
public void onBackPressed() 
{ 
    Intent intent = new Intent(this, Other.class); 
    startActivity(intent);  
} 

Po prostu upewnij się, że tak naprawdę chcesz robić.

+0

Dzięki, działa ... tylko jeden szczegół, jak mam go poinformować, która działalność rozpoczęła tę działalność, aby wiedział, do którego zwrotu? – Roger

+1

Jeśli chcesz powrócić do poprzedniej czynności, dlaczego normalna funkcja przycisku Wstecz nie jest akceptowalna? Pierwszą czynność można było określić, dodając informacje o niej w intencji użytej do uruchomienia drugiej czynności za pomocą metody intent.putExtra ("activity_name", "activity_1"), a następnie pobrania tej nazwy w drugim działaniu. Ale chyba że robisz coś bardzo niezwykłego w swojej działalności, twoje interesy będą lepiej obsługiwane przez zapisywanie twoich danych w trybie onPause() i onResume() bez nadpisywania onBackPressed(). – theisenp

+0

+1, aby uzyskać szczegółowe szczegółowe odpowiedzi! –

1

To jest podobne do this question, o które pytano wcześniej.

Mam nadzieję, że to pomoże! N.S.

+2

close, ale "moveTaskToBack (true);" zatrzymuje całą aplikację (np.działa jak przycisk "domowy"), a ja po prostu muszę zatrzymać jedną czynność. – Roger

5

Naciśnięcie klawisza WSTECZ uruchamia metodę oddzwaniania onBackPressed klasy Activity. Domyślna implementacja tego wywołania zwrotnego wywołuje metodę finish().

http://developer.android.com/reference/android/app/Activity.html#onBackPressed()

Można zastąpić tę metodę, aby przenieść działalność do tła (mimick działanie naciskając klawisz HOME

np.


@Override 
public void onBackPressed() { 
    onKeyDown(KeyEvent.KEYCODE_HOME);   
} 

Można też zamiast rozważyć moveTaskToBackground() wspomniano tutaj:

Override back button to act like home button

+0

nie, nie, wystarczy zatrzymać jedną czynność, a nie całą aplikację. :) – Roger

+0

Wierzę, że jeśli zatrzymasz działanie, stracisz jego kontekst i wszystkie zmienne lokalne. To broni celu, który próbujesz osiągnąć. Popraw mnie, jeśli się mylę. –

+0

niezupełnie, jeśli przestawię przycisk Wstecz, aby działał jak przycisk strony głównej, zawartość jest nadal dostępna po ponownym uruchomieniu aplikacji. Problem polega na tym, że zatrzymuje on całą aplikację, a ja po prostu muszę zatrzymać jedną aktywność. :) – Roger

0

Po pierwsze, przepraszam za nie udzielenie odpowiedzi na pytanie, ponieważ nadal nie mam na to optymalnej odpowiedzi. Ale bardzo mi się podoba, gdy ludzie zaczynają pytać "czego potrzebujesz".I bardzo rzadko osoba, która zadała to pytanie, naprawdę zasługuje na takie pytanie. Myślę, że nie tym razem, ale ok, to nie jest kwestia ...

każdym razie postaram się wskazać, dlaczego niektórzy z nas są przekonani, że

począwszy od działalności dla działalności B (tworzenie UI na podstawie pobierania niektórych danych) ORAZ

Powrót z B na A (niszczenie wszystkich utworzonych interfejsów i/lub pobranych danych w B) jest czasami złym pomysłem. Lepszym rozwiązaniem byłoby utrzymywanie stosu takim, jaki jest, więc użycie czegoś takiego jak finish() w Działaniu B, ale utrzymywanie aktywności B w trybie Pauzy, więc później, gdy wywołasz ją ponownie z Aktywności A - po prostu włączy się onResume = nic odtworzone w interfejsie użytkownika, brak pobierania dodatkowych danych. Bonusem jest oczywiście szybki i responsywny interfejs użytkownika, a różnica polega na tym, że masz bardziej skomplikowany układ interfejsu użytkownika.

10

prosta linia

@Override 
public void onBackPressed() { 
    mActivity.moveTaskToBack(true); 
} 
+0

niesamowite. Właśnie rozwiązałem mój problem z jedną linią – Jigar

+0

najlepszą odpowiedzią na wszystkie, rozwiązałem problem w jednym wierszu. –

1

udało mi się wypracować dokładnie, co chcesz: przełącznik pomiędzy 2 czynności za pomocą przycisku Wstecz i zachować je wszystkie nie zostać zniszczone!

Na przykład: masz 2 rodzajów działalności & B. zostaną rozpoczęte po pierwsze, a następnie A nazywa B. Jeżeli B jest załadowany, naciśnij przycisk Back użytkownik i przełącza się z powrotem do aktywności A z B. odtąd B powinny nie zostać zniszczonym i po prostu przechodzi do tła, a gdy użytkownik ponownie rozpocznie aktywność B od A, aktywność B zostanie przeniesiona na pierwszy plan zamiast ponownego utworzenia lub utworzenia nowej instancji!

Jak zaimplementować to:

1. Zastąp onBackPressed() działalności B:

@Override 
public void onBackPressed() { 
    Intent backIntent = new Intent(this, ActivityA.class); 
    backIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(backIntent); 
} 

2. A na aktywność, aktywność połączenia B:

public void callActivityB() { 
    Intent toBintent = new Intent(this, ActivityB.class); 
    toBIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
    startActivity(toBintent); 
} 

pamiętać, aby dodać flagę : Intent.FLAG_ACTIVITY_REORDER_TO_FRONT po wywołaniu A & B.

-2

Po prostu określ w manifeście dla działania jako

android:persistent="true" 

To powinno zapobiec zniszczeniu Twojej aktywności. Aby dowiedzieć się więcej na ten temat można znaleźć w tych poniższych linków, które zostały odebrane przez mnie

How to prevent call of onDestroy() after onPause()?

Prevent activity from being destroyed as long as possible

W powyższych stanowisk wyjaśniłem szczegółowo w przypadku użycia

+1

Ten atrybut nie istnieje dla działań: https://developer.android.com/guide/topics/manifest/activity-element.html – jekatt

+0

@jakatt istnieje https://developer.android.com/guide/topics/ manifest/application-element.html –

+0

@ aravind.udayashankara ten atrybut jest dla '' jak opisano w dokumentacji, którą poleciłeś. Również w tej dokumentacji https://developer.android.com/guide/topics/manifest/activity-element.html o '' atrybut 'android: persistent' nie istnieje –

Powiązane problemy