2011-09-29 13 views
20

Jestem ciekawy jednej rzeczy. Jak mogę zakończyć bieżącą działalność i rozpocząć inną.Android Zakończ Aktywność i rozpocznij kolejny

Przykład:

MainActivity 
    --(starts)--> LoginActivity 
     --(if success, starts)--> SyncActivity 
      --(if success start)--> MainActivity (with updated data). 

Więc chcę kiedy SyncActivity rozpoczyna MainActivity po udanym synchronizacji i jeśli nacisnąć przycisk wstecz nie wracać do SyncActivity lub jakakolwiek inna aktywność otworzył przed SynActivity.

Próbowałem z tym kodem:

Intent intent = new Intent(Synchronization.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
startActivity(intent); 
this.finish(); 

ale to nie działa prawidłowo. Jakieś pomysły, jak sprawić, aby wszystko działało prawidłowo?

+0

co oznacza "w tym samym czasie"? – Blackbelt

+0

Po prostu naprawię pytanie –

Odpowiedz

45

Zastosowanie

Intent intent = new Intent(SyncActivity.this, MainActivity.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 
+17

Ohh potężne flagi, yu tak nieodkryte ... (- – Audrius

+2

Zwróć uwagę, że jeśli nie wywołasz jawnie 'finish();' metoda 'onDestroy()' cyklu życia nie zostanie wywołana po ' startActivity (zamiar); '. – heyarne

3

Sądząc z PO, nie jestem pewien, czy to koniecznie musi zainicjować swoją główną działalność dwukrotnie ..

Android jest tak skonstruowany, że aplikacja nie jest naprawdę zamknięte przez użytkownika . Koncentrat na nadrzędnych Android metody cyklu życia takich jak OnResume i OnPause zapisać dane UI itp

Stąd nie trzeba jawnie (i naprawdę nie powinno) finish() główną działalność. Aby uzyskać dane logowania lub synchronizacji z poprzednich działań, wystarczy zastąpić metodę OnActivityResult(). Jednak aby to zrobić, musisz rozpocząć działanie, używając startActivityForResult(intent). Więc dla każdego rodzaju działalności, należy to zrobić:

Główna działalność:

static public int LOGIN_RETURN_CODE = 1; 

rozpocząć logowanie:

Intent intent = new Intent(MainActivity.this, LogInActivity.class); 
startActivityForResult(intent, LOGIN_RETURN_CODE); 

otrzymywać zalogować informację:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case LOGIN_RETURN_CODE: 
     //do something with bundle attached 
    } 
} 

aktywności Logowanie:

static public int SYNC_RETURN_CODE = 2; 

rozpocząć Sync:

Intent intent = new Intent(LogInActivity.this, SyncActivity.class); 
startActivityForResult(intent,SYNC_RETURN_CODE); 

otrzymywać informacje i powrócić do Main:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     switch (requestCode) { 
      case MainActivity.SYNC_RETURN_CODE: 
      Intent intent = new Intent(...); 
      intent.setResult(RESULT_OK); 
      finish(); 
     } 
    } 

to może nie wszystko skompilować, ale mam nadzieję, że masz pomysł.

Powiązane problemy