'FLAG_ACTIVITY_CLEAR_TOP'에 해당되는 글 2건

  1. 2012.11.01 [Android] 스택에 쌓인 액티비티 모두 종료하기 (2)
  2. 2011.12.05 intent FLAG_ACTIVITY_CLEAR_TOP
2012.11.01 15:24

예를들어 A, B, C Activity가 있다고 칩시다.


A에서 B로 갈 때 finish()를 하지 않고 갑니다. 


즉, 


Intent intent = new Intent(A.this, B.class);

startActivity(intent); 


startActivity(intent); 만 이용해서 이동한 것이지요.


그렇게 B로 이동한 후 또 C로 이동합니다. 

Intent intent = new Intent(B.this, C.class);

startActivity(intent); 


이렇게 C로 이동한 후 이동 한 후 C를 종료하면서 A로 바로 이동하고 싶습니다. 그런데 A로 이동하면서 B도 끄고 싶습니다.


이런경우 보통 FLAG_ACTIVITY_CLEAR_TOP 플래그를 이용해서 이동합니다.

Intent intent = new Intent(C.this, A.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent); 
finish();


하지만 Activity가 많아질 경우 FLAG_ACTIVITY_CLEAR_TOP 은 더이상 통하지 않습니다.


간단하게 처리하기 위해서는 Activity를 상속받은 BaseActivity 클래스를 따로 만들어준 후 ArrayList<Activity>를 이용해서 


추가된  Activity 들을 한번에 종료시켜주는 것이 가장 확실한 방법인 것입니다. 그럼 구현 하는 방법을 알아볼까요?


BaseActivity에 ArrayList<Activity>을 선언해줍니다.

 public static ArrayList<Activity> actList = new ArrayList<Activity>();


그리고 A이동할 메소드에 해당 소스를 넣어줍니다.

actList 에 쌓인 Activity들을 for문을 돌려 모두 finish() 시켜버리는 것입니다.

for(int i = 0; i < actList.size(); i++)

actList.get(i).finish();

intent = new Intent(C.this, A.class);

startActivity(intent);

finish(); 


이렇게만 해주면 제대로 동작하지 않습니다.

목적은 C와 A 사이에 있는 B를 제거하기 위함이므로 B를 actList 에 추가해줍니다.

onCreate()에서 추가해주면 됩니다.

//일단 B를 상속받고... 
public class B extends BaseActivity{


@Override

protected void onCreate(Bundle savedInstanceState) {

actList.add(this); // actList에 B를 추가해줍니다.

super.onCreate(savedInstanceState);

setContentView(R.layout.b);


}


}


이렇게 만들어 놓고 필요시 for문을 돌려 Activity들을 언제든지 삭제할 수 있는 것입니다. ^^



신고
Posted by 그린블로그 DEV그린
2011.12.05 15:02

Intent intent = new Intent(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

와 같은 방식으로 사용하며

런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다.
가령 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다. (A->B->C->A 인 경우에
마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.


예를 들면 현재 ABCDE순서로 엑티비티가 스택에 들어있다고 할때 엑티비티E에서 C를 호출하게 되면 D와 E는 스택에서 삭제되고 ABC만이 남아있게 됩니다. 여기서 AB 역시 남는다는 것을 이해하셔야 합니다.

신고
Posted by 그린블로그 DEV그린