7

Obserwuję zachowanie metody Intent.FLAG_ACTIVITY_CLEAR_TOP.Aktywność flagi Usuń wierzchołek niszczy aktywność docelową, a następnie ją tworzy

Na przykład mam trzy działania A, B i C Teraz Flow A -> B -> C

Teraz kiedy jestem rozpoczynając od C z tej flagi z następującego kodu.

Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(intent_to_a); 

AFAIK, Intent.FLAG_ACTIVITY_CLEAR_TOP należy usunąć B i należy wznowić A .To ma również takie same, ale w dziwny sposób. Usuwa B, zamiast usuwa A, niż tworzy A. Metoda onDestroy of A jest również wywoływana. Czy ktoś może mi powiedzieć, czy to właściwe, czy nie? Jeśli nie chcę, aby zniszczył się, co powinienem zrobić?

+2

spojrzenie FLAG_ACTIVITY_REORDER_TO_FRONT, to jest bliżej do tego, co chcesz http://developer.android.com/reference/android/content/Intent.html –

+1

Tak, wyglądało na to też, ale ja też chcę B zostać zniszczonym, FLAG_ACTIVITY_REORDER_TO_FRONT umieszcza tylko A na wierzchu ActivityStack bez usuwania B. –

+1

może mógłbyś użyć LocalBroadCastManager wysłać osobną intencję do B, aby zakończyć, a następnie użyć Reorder_to_front? Mogłabym dostarczyć kod źródłowy, jeśli jest to coś, co cię interesuje, –

Odpowiedz

3

Użyj FLAG_ACTIVITY_REORDER_TO_FRONT, a następnie użyj intencji, aby powiedzieć B, aby zakończyć.

Aktywność B.

private BroadcastReceiver finishReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      finish(); 
     } 
    }; 
public void onCreate() { 
LocalBroadcastManager.getInstance(this) 
       .registerReceiver(finishReceiver , 
         new IntentFilter("B-finish")); 
} 
public void onDestroy() { 
     LocalBroadcastManager.getInstance(this).unregisterReceiver(
       finishReceiver); 
} 

Działanie C:

LocalBroadcastManager.getInstance(this).sendBroadcast(
       new Intent("B-finish")); 
Intent intent_to_a=new Intent(C.this,A.class); 
       intent_to_home.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
       startActivity(intent_to_a); 
+0

Hej, nie znajduję żadnej klasy, takiej jak LocalBroadcastManager w mojej obecnej wersji Androida, używam wersji Android 2.3.3, api poziom 10. –

+0

musisz dodać bibliotekę wsparcia v4 http : //developer.android.com/tools/extras/support-library.html –

2

Albo,
. Zmień launchMode z Aktywności A na coś innego ze standardowego (np. singleTask lub coś podobnego). Następnie flagę FLAG_ACTIVITY_CLEAR_TOP nie uruchomi ponownie aktywny A.

lub

. Użyj flagi Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP. Wtedy zadziała tak, jak sobie życzysz.

This question has good discussion on same topic
Android documentation mówi -

aktualnie działającej instancji działalności B w powyższym przykładzie będzie albo otrzymać nową intencję zaczynają tu w swojej metodzie onNewIntent(), lub być sam skończył i wznowiona z nowym zamiarem.

Jeśli zadeklarowano, że tryb uruchamiania ma wartość "wiele" (ustawienie domyślne), a użytkownik nie ustawił FLAG_ACTIVITY_SINGLE_TOP w tym samym celu, zostanie on zakończony i ponownie utworzony; dla wszystkich innych trybów uruchamiania lub jeśli ustawiono FLAG_ACTIVITY_SINGLE_TOP, ta intencja zostanie dostarczona do bieżącej instancji naNewIntent().