2011-12-23 13 views
5

Mam opracowaną aplikację w Android 4.0.3 (Ice-cream Sandwich), używam dwóch działań, aby przetestować nawigację działania.Ale zaobserwowałem inne zachowanie w nawigacji Aktywności.Czy to nowa implementacja w systemie Android 4.0?

Wywołuję aktywność B z działania A. W działaniu B właśnie wywołuję metodę finish(). Abyśmy mogli zobaczyć poprzednią czynność A. Działa dokładnie tak, jak oczekiwano, ale problem dotyczy nawigacji wstecznej (metoda wywoływania zakończona lub naciśnięcie klawisza wstecznego), wywołuje metodę Utwórz działanie A) zamiast wywoływania funkcji onResume (). Ale w poprzednich wersjach nie zachowuje się w ten sposób. Czy to nowa implementacja w systemie Android 4.0?

Oto przykład, który I wdrożone:

Activity_A:

public class Activity_A extends Activity { 

    /** Called when the activity is first created. */ 
    static int count=0; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView text=(TextView)findViewById(R.id.textcontent); 
     text.setText("Activity 1 called:"+(++count)+" Times"); 
    } 

    public void onClick(View v) 
    { 
     Intent intent=new Intent(this,Activity2.class); 
     startActivityForResult(intent, 1); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d("onActivityResult", "Called with Code:"+resultCode); 
    } 

} 

Activity_B:

public class Activity_B extends Activity { 

     /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView text=(TextView)findViewById(R.id.textcontent); 
     text.setText("Activity 2"); 
    } 

    public void onClick(View v) 
    { 
     setResult(1); 
     finish(); 
    } 
} 

należy sprawdzić i dać mi znać, jeśli robię żadnego błędu.

Dzięki, Ram.

+0

Pytanie: Czy onResume przychodzi po onCreate? Wydaje mi się, że działanie A zostało porzucone przez Androida po wywołaniu Aktywności B - coś, co może się zdarzyć na wszystkich platformach Android. –

Odpowiedz

1

To z Android dokumentacji aktywność (Link here):

  • Jeżeli działanie na pierwszym planie na ekranie (na górze stosu) jest aktywny, czy pracuje.
  • Jeśli aktywność została utracona, ale nadal jest widoczna (to znaczy, że na początku aktywności nie ma pełnowymiarowej lub przezroczystej aktywności), jest ona wstrzymana. Wstrzymana aktywność jest całkowicie żywa (utrzymuje wszystkie informacje o stanie i pręcie i pozostaje dołączona do menedżera okien), ale może zostać zabita przez system w sytuacjach o wyjątkowo niskiej pamięci.
  • Jeśli działanie jest całkowicie zasłonięte przez inną aktywność, zostaje zatrzymane. Nadal zachowuje wszystkie informacje o stanie i pręcie, jednak nie jest już widoczne dla użytkownika, więc jego okno jest ukryte i często będzie ono zabijane przez system, gdy pamięć będzie potrzebna gdzie indziej.
  • Jeśli działanie zostało wstrzymane lub zatrzymane, system może usunąć aktywność z pamięci, albo prosząc ją o zakończenie, albo po prostu zabijając jej proces. Po ponownym wyświetleniu użytkownikowi należy go całkowicie zrestartować i przywrócić do poprzedniego stanu.

Być może punkty 3 i 4 są istotne dla Ciebie.

+0

, ale to tylko około dwóch działań. I to jest pierwsza aplikacja 3rd party w moim urządzeniu (Samsung Nexus S) po aktualizacji do wersji 4.0.3, to jak to może być problem z niską pamięcią? – ram

+0

Z diagramu aktywności - jeśli aktywność ukrywa starą aktywność, działanie zostaje zatrzymane. Jeśli system nie potrzebuje pamięci, wywołuje onRestart, zamiast onResume. Może od tego zaczyna się twój program? Nie wspomnieli o żadnych zmianach w lodzie dotyczącym przechodzenia do OnCreate od onStop, chyba że system potrzebuje pamięci. – Davos555

+0

OK Dziękuję bardzo za informacje. – ram

7

Mam ten sam problem !! Przejdź do Ustawienia/Rozwój/i usuń zaznaczenie pola wyboru "Zniszcz działania"

+0

** Uwaga **: - Telefon musi zostać uruchomiony ponownie, aby zobaczyć efekt. – Deepak

+0

jeśli otworzę kamerę do przechwytywania obrazu na Androidzie 4.03 to onActivityResult metoda nazywa się przed przechwyceniem lub anulowaniem obrazu, więc kod wynikowy zawsze ma wartość zerową i nie mógłbym obsłużyć zdarzenia przechwytywania obrazu na onActivityResult. mam jakiś pomysł, dlaczego tak się stało? testuję to na htc mnie 4.03, chociaż działa to w wersji intext 4.04 i-tab. –

0

Aby utrzymać stan działania, należy użyć metod onSavedInstanceState() i onRestoreInstanceSate().

0

Zobacz tę odpowiedź: https://stackoverflow.com/a/16147110/1306419. Cytuję stąd:

Być może trzeba zadeklarować tryb uruchamiania swojej aktywności A (działanie macierzyste) jako: android:launchMode="singleTop" w swoim AndroidManifest.xml. jeśli tego nie zrobisz, Android użyje standardowego trybu uruchamiania, co oznacza The system always creates a new instance of the activity in the target task., a działanie zostanie odtworzone (Android documentation).

Z singleTop system powraca do istniejącej aktywności (z oryginalnym dodatkiem), jeśli znajduje się na wierzchu stosu zadań.

Powiązane problemy