2013-03-14 13 views
5

Podczas normalnego rozwoju zauważyłem, że określona aktywność przestała odpowiadać po raz drugi.onResume() nie jest wywoływany po raz drugi, gdy uruchamiane jest działanie

tj menu->(intent)->activity->(back button)->menu->(intent)

Nie ma nic istotne w LogCat.

ja nawet nie wiem od czego zacząć, ani co to debugowania kodu, aby pokazać tak oto onClick i onResume fragmenty:

if (!dictionary.getClassName().equals("")) { 

      this.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 

        Intent i; 

        i = new Intent(mContext, NVGlobeNavigatorVC.class); 
        i.putExtra("PAGE_TITLE", title); 
        i.putExtra("TITLE", _dictionary._title); 

        mContext.startActivity(i); 

      }); 
     } else { 
      findViewById(R.id.greaterthan).setVisibility(View.GONE); 
     } 

oraz w działalności rusza:

@Override 
protected void onResume() { 

    super.onResume(); 

    ... 

Nie ma też nic niezwykłego:

<activity 
    android:name=".NVViews.NVGlobeNavigatorVC" 
    android:theme="@style/WindowTitleBackground" 
    android:label="GlobeNavigator"/> 

For clar ia, umieściłem punkty przerwania na mContext.startActivity(i) i super.onResume(). Klikam na widok z onClickListener i oba punkty przerwania są trafiane zgodnie z oczekiwaniami. Następnie naciśnij przycisk powrotu, który powoduje powrót do menu. onPause() jest wywoływany zgodnie z oczekiwaniami.

Dotknij widok, aby ponownie uruchomić działanie, a punkt przerwania na startActivity został trafiony, ale nie w onResume() w działaniu docelowym. Ekran staje się czarny i jedynym sposobem na ponowne uruchomienie jest ponowne uruchomienie aplikacji. Jeśli wstrzymam debugger, zatrzymuje się w dalvik.system.NativeStart(), co oznacza, że ​​działanie nigdy nie zostanie ponownie uruchomione.

Nie sądzę, że jest to istotne, ale używam Intellij IDEA i usunąłem wszystkie katalogi wyjściowe, unieważniłem pamięci podręczne i wykonałem pełną przebudowę.

Docelowe API to 8. Przetestowałem w wersji 2.3 i 4.0.4.

Wszelkie pomysły? Jestem zdumiony.

[EDIT]

W , ja zaoszczędzić trochę rzeczy do preferencjach. Celem onResume() jest dostać je z powrotem:

@Override 
protected void onPause() { 

    super.onPause(); 

    SCPrefs.setGlobeViewViewPoint(globeView.getViewPoint()); 
    SCPrefs.setGlobeViewZoom(globeView.getZoom()); 
    SCPrefs.setGlobeViewScale(globeView.getScale()); 

    } 
+0

czy drugie działanie jest prawidłowo wywoływane? – stinepike

+0

@StinePike Nie powinno być wywoływane, jeśli 'Activity' jest w tle. Czy zastępujesz 'onPause()' i robisz cokolwiek tam? – codeMagic

+0

@StinePike Nie jest wywoływany, ale nie spodziewam się, że tak jest, ponieważ jest na szczycie stosu i mało prawdopodobne, że Android zniszczy moją aktywność. – Simon

Odpowiedz

4

znalazłem problem, i to nieco ezoteryczne.

Mam dużą statyczną strukturę danych, która jest ładowana do statycznego inicjalizatora klasy. Wystąpił błąd w tym inicjatorze powodujący nieskończoną pętlę po raz drugi, gdy została wywołana, jeśli struktura danych była jeszcze załadowana.

Ponieważ ta klasa jest przywoływana w mojej aktywności, program ładujący klasy ładuje ją przed wywołaniem onCreate() lub onResume().

Pętla dała wrażenie, że zawieszono moduł ładowania czynności.

+0

Cieszę się, że to wymyśliłeś. – HalR

+0

Tak, Hhow dokładnie rozwiązałeś ten problem, ponieważ mam DOKŁADNIE ten sam problem. – Rouz

+0

@Rouz Jak już powiedziałem. W statycznym inicjatorze pojawił się błąd, który powodował nieskończoną pętlę. Naprawiłem błąd, wszystko działało. Kluczem jest to, że program ładujący klasy jest wywoływany przed onCreate(). – Simon

3

ten kod:

i = new Intent(mContext, NVGlobeNavigatorVC.class); 

tworzy nową intencję. Intencja ma klasę NVGlobeNavigatorVC.class.

Jeśli wywołasz go raz, utworzysz nowe działanie, możesz nazwać je "iTheFirst". Jeśli wycofasz się z działania, uruchamia się on "na pauzie". Gdy ponownie uruchomisz powyższy kod, utworzysz kolejną nową aktywność tej samej klasy, ale inną aktywność. W związku z tym nie wznowi on twojej innej działalności, ale utworzy nowy, który moglibyśmy nazwać "iTheSecond". Wygląda podobnie do iTheFirst, ale jest wyjątkowy.

Jeśli chcesz wznowić powyższe, po wycofaniu się z niego musisz zachować odniesienie do niego w swoim menu. Następnie w swoim onClick sprawdź, czy ta aktywność istnieje, a jeśli nie, zrób nową i uruchom ją, a jeśli istnieje, po prostu ją wznów.

Oto próbka że aktywność pamięta i wznawia działalność:

Intent savedCueCardActivity = null; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState, R.layout.landing); 
} 

public void goToNextScreen(View v) { 
    if (savedCueCardActivity == null) { 
     savedCueCardActivity = new Intent().setClass(this, CueCardActivity.class); 
     startActivity(savedCueCardActivity); 
     //  lastActivity.finish(); 
    } else { 
     savedCueCardActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     startActivity(savedCueCardActivity); 
    } 
    overridePendingTransition(R.anim.fade_in, R.anim.fade_out); 
} 
+0

Wiem o tym wszystkim. Przeczytaj pytanie. Nie spodziewam się pracować z tą samą instancją. Niezależnie od tego, czy przy drugim uruchomieniu działania jest to samo wystąpienie, nowa instancja czy 40. instancja, nadal oczekuję wywołania onResume. Aha, i moja aplikacja się nie zawiesza;) – Simon

+0

Aby być jeszcze bardziej zrozumiałym, 'onResume()' powinno być wywoływane w każdej możliwej okoliczności działania przychodzącego na pierwszy plan. Dodatkowo, moim problemem jest to, że aplikacja zawiesza się, najwyraźniej w DVM, bez żadnych istotnych informacji w logcat. Jeśli zostanę bez debugowania, otrzymam ANR, więc główny wątek przestał odpowiadać. – Simon

+0

Przepraszamy za brak synchronizacji z głębszym pytaniem. Twoje komentarze na temat tego pytania pozwoliły mi uwierzyć, że myślisz, że odzyskasz pierwotną działalność. Jak wiem, otrzymuję onCreate() za każdym razem, gdy wykonuję nową czynność, jak robisz z i = newIntent. To pytanie było dla mnie naprawdę dobre, ponieważ wnikam głębiej w cykl życia aktywności, więc naprawdę to doceniam. Jedna inna sugestia - przed wywołaniem metody onCreate() inicjalizacje mają miejsce w działaniu. Czy robisz coś dziwnego? Czy przesłoniłeś naCreate, aby zobaczyć, jak to się nazywa? – HalR

Powiązane problemy