2012-01-17 9 views
6

Nie wiem, dlaczego tak trudno to rozgryźć. Mam swoją główną działalność, która po uruchomieniu sprawdza, czy jest to pierwszy raz, kiedy została otwarta. Jeśli tak, to zamyka główną czynność i otwiera działanie konfiguracji/wprowadzania z FLAG_ACTIVITY_NEW_TASK. Proces konfiguracji składa się z trzech czynności (A, B i C). Pod koniec działania C, jak go usunąć i skonfigurować zadanie, które zawiera A, B i C i ponownie rozpocząć główną aktywność. Próbowałem dodać FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TOP do głównej działalności Intent, ale po naciśnięciu przycisku BACK wraca do działania C procesu instalacji. Jak mogę to zrobić, aby wyczyścić zadanie działań A, B i C, gdy C kończy się i rozpoczyna główny? Dzięki!Czyszczenie zadania i rozpoczęcie nowej aktywności

Buduję w systemie Android 1.6 (API 4), więc niektóre z flag Activity mogą być ograniczone.

+0

Dokończ czynność C, przechodząc do głównej czynności. – Mudassir

+0

czyszczenie flagi powoduje tylko jedno działanie ze stosu, czyż nie? – L7ColWinters

+0

@Mudassir Jeśli po prostu zakończę działanie C, to kiedy naciśniesz BACK z głównego działania, po prostu przejdzie do działania B. – Brian

Odpowiedz

0

I odpowiedział na podobne pytanie here

Jak Mudassir mówi w swoim komentarzu zaledwie finish() swoje działania natychmiast po uruchomieniu nowego.

+0

Nie, chcę, aby użytkownik mógł cofnąć się o krok, jeśli zajdzie taka potrzeba podczas procesu instalacji. Wszystko, co chcę, to ukończyć stos czynności konfiguracyjnych po wykonaniu ostatniego kroku. – Brian

2

FLAG_ACTIVITY_CLEAR_TOP wyczyści działania, które są z tej samej instancji działania. Tutaj w twoim przypadku wszystkie twoje działania są różnych instancji, więc FLAG_ACTIVITY_CLEAR_TOP nie będzie działać. Aby wyczyścić zadanie, utwórz instancję działania w każdej aktywności i przypisz tę instancję "to" do metody onCreate dla każdego działania. kiedy chcesz usunąć zadanie, wywołaj instancję instance.finish(). i rozpocznij aktywność, którą chcesz.

+1

Czy to może zakończyć wszystkie TRZY działanie na raz? – Mudassir

+0

jego nie raz, widzisz, że masz Aktywność A, B, C. Aby ukończyć wszystkie te czynności naraz, wystarczy zrobić coś podobnego poniżej activityA_instace.finish(); activityB_instace.finish(); activityC_instace.finish(); upewnij się także, że twoje wystąpienia są statyczne z działania, które zadeklarowałeś. Jeśli tak jest, możesz usunąć zadanie z dowolnego miejsca, po prostu pokazałem powyżej – amandroid

+0

Co dokładnie masz na myśli, na przykład? Czy możesz wyjaśnić, używając jakiegoś kodu? – Mudassir

0
class A extends Activity { 
public static Activity instanceOfA = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfA = this; 
} 
} 

class b extends Activity { 
public static Activity instanceOfB = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfB = this; 
} 
} 


class c extends Activity { 
public static Activity instanceOfC = null; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    instanceOfC = this; 
} 
} 

Teraz załóżmy, że chcesz usunąć wszystkie zadania ze swojej bieżącej działalności, a następnie zadzwonić instanceOfA.finish(); instanceOfB.finish(); instanceOfC.finish();

+9

Jest to niedopuszczalne. Przenikasz wszystkie działania i wszystkie zasoby (zobacz hiarerchies, * images *) z nimi związane. –

+0

Coś podobnego do tej [odpowiedź] (http://stackoverflow.com/a/3008684/269876) będzie ci bardziej odpowiadać. Jak zauważa @ JonasAlves, wszystkie te działania są przeciekające przez użycie statyki. Zamiast tego wyślij wiadomość, którą możesz nadać, gdy instalacja się zakończy, i każda z czynności konfiguracyjnych będzie nasłuchiwała transmisji. Po otrzymaniu powiadomienia o ukończeniu konfiguracji mogą się sfinalizować, a do osiągnięcia tego nie są wymagane żadne statyki. –

+2

Statyczne odniesienia do działań oznaczają, że Twoje poglądy pozostają w pamięci i nie podlegają recyklingowi, co powoduje wyciek pamięci. – George

1

Właściwie można to osiągnąć z startActivityForResult

public class A extends Activity { 
    public onButtonClick() { 
     startActivityForResult(new Intent(this, B.class), 0); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
     finish(); 
     } 
    } 
} 

public class B extends Activity { 
    public onButtonClick() { 
     startActivityForResult(new Intent(this, C.class), 0); 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
     setResult(RESULT_OK); 
     finish(); 
     } 
    } 
} 

public class C extends Activity { 
    public onButtonClick() { 
     setResult(RESULT_OK); 
     finish(); 
    } 
} 

myślę, że to jest właściwa droga, nie wycieka nic w ten sposób.

PS: Wiem, że to stary post, ale może ktoś uzna to za przydatne.

Powiązane problemy