이 블로그 검색

2011년 8월 29일 월요일

액티비티 Flag 사용법

안드로이드를 개발하다면 액티비티를 통해 화면전환을 하다
뜻하지 않게 많은 동일 액티비티가 생성되어 있음을 확인할 수 있습니다.

이는 사용자 입장에서도 Back 키의 반복작업을 해야 하므로 불편하기도 하거니와  리소스에도 문제가 됩니다.
오늘은 이 문제에 대해 해결하는 방법을 찾아 봤습니다.

우선 XML에서 정의하는 정적인 방식과 코드상에서 정의하는 동적인 방법이 있습니다.

1. AndroidManifest.xml  정의하는 방식

 <activity android:name="ButtonActivity" 
      android:launchMode="singleTask">
  </activity>

launchMode에 플래그를 정의하며 사용가능한 속성은 다음과 같이 4가지만 가능합니다.

  standard: 
  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능 합니다.
  singleTop: 
  스택중 어느곳에나 위치 가능하며 여러개의 인스턴스가 생성가능하고 호출한 activity와 현재
  최상위 activity가(top activity) 동일한 경우 최상위 activity가 재사용 된다(기존 최상위 activity는 pop)
  singleTask: 
  루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하다(타 task에서 동일 activity 사용불가)
  다른 액티비티 실행시 동일 Task내에서 실행이 가능하다

 singleInstance: 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하고 태스크내에 해당
  액티비티 하나만 속할 수 있어 다른 액티비티를 실행시키면 새로운 Task가 생성되어
  (FLAG_ACTIVITY_NEW_TASK와 동일) 그 Task내에 포함된다


2. 코드로 정의하는 방식
  소스코드에서 플래그를 사용하고 싶을때에는 Intent에 addFlags() 또는 setFlags() 메소드를 사용합니다.
1.intent = new Intent(this
2.Activity3.class);
3.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
4.startActivity(intent);

사용할 수 있는 플래그 정보는 다음과 같습니다.

  FLAG_ACTIVITY_NEW_TASK: 
  동일 affinity의 task가 있으면 그곳에 실행되고 아니면 새로운 task를 실행합니다.

  FLAG_ACTIVITY_SINGLE_TOP: 
  상단 singleTop과 같으며, 실행시 재사용 액티비티의 실행은 onPause(), onNewIntent(), onResume()
  순으로 호출 됩니다.
  => [B]를 single top설정: [A][B] 상태에서 [B] 호출시 => [A][재사용된B]
  => [B]를 single top설정: [B][A] 상태에서 [B] 호출시 => [B][A][B]

  FLAG_ACTIVITY_NO_HISTORY:
  해당 액티비티는 재활성화시(back키를 눌러 다시 활성화될때) pop  됩니다.
  => [B]를 no history설정: [A][B][A] 상태에서 back키 사용시 [A]가 pop 되고 [B] 역시 
  no history에 의해 pop => [A]

  FLAG_ACTIVITY_REORDER_TO_FRONT:
  activity 호출시 이미 같은 activity가 task내에 있으면 같은 activity는 pop 시키고 해당 activity가 push 됩니다.
  => [A]를 reorder to front설정: [A][B] 상태에서 [A] 호출시 같은 activity인 [A]가 pop되고 => [B][A]

  FLAG_ACTIVITY_CLEAR_TOP:
  해당 task에 있는 모든 activity를 pop 시키고 해당 activity가 root activity로 task에 push 됩니다.
  => [A]를 clear top설정: [A][B] 상태에서 [A] 호출시 모두 pop되고 => [A]
  단, 해당 플래그는 액티비티를 모두 onDestroy() 시킨 후 새롭게 onCreate() 시키기 때문에 [A]를
  유지하려면 FLAG_ACTIVITY_SINGLE_TOP 플래그와 함께 사용하면 됩니다.


댓글 없음:

댓글 쓰기