2014-04-21 4 views
0

활동 A, 활동 B, 활동 C가 있습니다. A에서 B로 이동하고, b는 로그인 페이지를 표시하고, 사용자는 활동 b를 종료하고 활동 a ...로 이동하여 이동합니다. 활동 c. 어떻게해야합니까? 전역 변수를 사용하고 메모리에 활동 A를 유지하므로 사용자가 로그인 할 때 ... 다음을 호출합니다.다른 활동의 활동 닫기

finish(); 글로벌 변수 설정 a.finish()

지금 문제가 어디에 있습니까? 내 응용 프로그램이 낮은 메모리에서 실행되고 있다고 가정하고 백그라운드로 돌아가서 내 응용 프로그램으로 돌아갑니다. 갑자기 글로벌 변수가 손실되었으므로 해결책은 무엇입니까? 당신은 그 방법을 로그인 C.

로 이동하면

답변

0

더 나은 방법은 이전 활동 스택을 취소하는 것입니다, C는 제거 활동 스택 및 활동 A와 B의 새로운 최상위입니다.

Intent intent = new Intent(getApplicationContext(), ActivityC.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent); 

편집 :

나는 개인적으로 내 자신의 애플 리케이션 에 따라 (조금 복잡하게 들릴 수도 있지만, 작동) 또 다른 방법 : 사용하여 A에서

시작 B 특정 RequestCode.

Intent intent = new Intent(ActivityA.this, ActivityB.class); 
    startActivityForResult(intent, LOGIN_INTENT); 

로그인 로그인에 성공한 활동 B의 사용자 B 마무리에서 설정 같은 ResultCode() B.

onSuccessfulLoginCallback() { 
     Intent resIntent = new Intent(); 
     setResult(LOGIN_OK, resIntent); 
     finish(); 
} 

제어 지금 onActivityResult를에서, 이제 다시 활동 A로 간다() A의 RequestCode와 ResponseCode를 확인하십시오. 서로 일치하면 때, 다음,

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if(requestCode == LOGIN_INTENT) { 
      if(resultCode == LOGIN_OK){ 
      Intent homeIntent = new Intent(ActivityA.this, ActivityC.class); 
      startActivity(homeIntent); 
      finish(); 
} 
+0

back..i의 클릭에, 작동하지 않는이 하나가 여전히 활동 b와 c – user3278732

+0

오,이 경우에, 당신은 할 수 있습니다 참조 'intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); – Swayam

+0

이 아이디어는 좋지만, 불행히도 제공하신 코드는 그렇게하지 않습니다. Whan 당신은'FLAG_ACTIVITY_CLEAR_TOP'으로'ActivityC'를 시작합니다 ** 이것은 ** 활동 스택을 지울 것입니다 ** 다시 C 활동으로 돌아갑니다 **. 그러나 액티비티 C **가 액티비티 스택에 없기 때문에 단순히 액티비티 C를 스택 **의 다른 액티비티 위에 배치합니다. FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_NEW_TASK를 추가해도 도움이되지 않습니다. 죄송합니다. –

1

나의 제안은 당신이 결과 StartActivityForResult을위한 활동 B를 시작하고 C로 이동하기로 결정 때 활동 B의 결과를 설정하고 마무리한다는 것입니다 활동 C와 마무리 A. 시작 그래서, 활동 A의 OnActivityResult 방법은 사용자가 설정 한 결과는 A. 완료 할 수있는 방법을 호출되는 않는

예제 코드 :

활동

private static final int ACTIVITY_B_CODE = 200; 
private void startB(){ 
    Intent intent = new Intent(ActivityA.this, ActivityB.clasS); 
    startActivityForResult(intent, ACTIVITY_B_CODE); 
} 

@Override 
protected void onActivityResult (int requestCode, int resultCode, Intent data){ 
    if (requestCode == ACTIVITY_B_CODE){ 
     if (resultCode == RESULT_OK){ 
      finish(); 
     } 
    } 
} 

활동 B :

private void startC(){ 
    Intent intent = new Intent(ActivityB.this, ActivityC.class); 
    startActivity(intent); 
    setResult(RESULT_OK); 
    finish(); 
} 

더 그것에 대해 : android documentations

+0

은 정적으로 저장하는 것과 다릅니다. 나는 acti vity를 열었고, b에 가서 C로 갔다. 나는 backgroun에 갔다. 낮은 기억 때문에 안드로이드 OS가 내 활동을 죽였다. 내가 c ..로 돌아가 로그인을 클릭하면 활동 b 또는 a를 닫지 못합니다. 그것은 글로브 변수 – user3278732

+0

을 사용하는 것과 많이 다르지 않습니다. 플래그를 사용하여 안드로이드 스택의 기본 동작을 변경하지 않으면 시스템이 액티비티 스택을 유지해야하므로 시스템이 해당 스택을 죽였다고해도 실제로 b에서 a로 되돌아 갈 수 있습니다. 방법. –

관련 문제