안드로이드를 개발하다면 액티비티를 통해 화면전환을 하다
뜻하지 않게 많은 동일 액티비티가 생성되어 있음을 확인할 수 있습니다.
이는 사용자 입장에서도 Back 키의 반복작업을 해야 하므로 불편하기도 하거니와 리소스에도 문제가 됩니다.
오늘은 이 문제에 대해 해결하는 방법을 찾아 봤습니다.
우선 XML에서 정의하는 정적인 방식과 코드상에서 정의하는 동적인 방법이 있습니다.
1. AndroidManifest.xml 정의하는 방식
<activity android:name="ButtonActivity"
android:launchMode="singleTask">
</activity>
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 플래그와 함께 사용하면 됩니다.
댓글 없음:
댓글 쓰기