안드로이드 시스템은 액티비티를 ActivityManager를 통해 Activity Stack으로 관리한다.
스택을 제어하는 방법
1. Intent의 플래그(Flag)로 제어하는 방법
액티비티를 실행하는 인텐트에 플래그를 이용해서, 스택 목록에 어떻게 올라가야 한다고 명시하는 방법이다.
2. LaunchMode 속성 설정
액티비티를 등록하는 AndroidManifest.xml 파일의 설정으로, 액티비티가 실행될 때 스택 목록에 어떻게 올라가야 한다고 명시하는 방법
- 새로운 액티비티가 실행되면 이전의 액티비티는 정지된 상태로 액티비티 스택에 저장되고, 새로운 액티비티가 화면에 보인다.
- 화면에 보이던 액티비티가 없어지면 액티비티 스택의 가장 위에 있는 액티비티가 화면에 보이면서 동작하게 된다.
- 만약, 동일한 액티비티를 여러 번 실행한다면, 동일한 액티비티가 여러 개 스택에 쌓이게 되고, 동시에 데이터를 여러 번 접근하거나 리소스를 여러 번 사용하는 문제가 발생할 수 있다.
- 이러한 문제를 플래그 또는 런처 모드를 사용해 해결한다.
1. 인텐트에 플래그 설정
액티비티를 실행하는 인텐트에 플래그를 이용해서, 스택 목록에 어떻게 올라가야 한다고 명시하는 방법이다.
아래 짧은 코드 예시를 통해 사용법을 확인하자.
var intent = Intent(getBaseContext(), AnotherActivity::class.java) //인텐트 객체 생성
intent.putExtra("startCount", String.valudOf(startCount)) //부가 데이터 넣기
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) //인텐트 플래그 설정
startActivityForResult(intent, REQUEST_CODE_ANOTHER) //인텐트 띄우기
- 새로운 액티비티를 실행할 때마다 메모리에 새로운 객체를 만들고 이전 화면 위에 쌓는 방식은 비효율적이다. 이를 해결하기 위해 플래그를 사용한다.
- 액티비티를 생성할 때 이미 생성된 같은 액티비티가 있으면 그 액티비티를 그대로 사용하라는 플래그 옵션을 사용한다.
참고
부모 액티비티에서 전달하는 인텐트는, 새로 만들어지는 액티비티의 onCreate() 메서드 안에서 getIntent() 메서드를 이용해 객체를 참조하여 처리한다. 액티비티를 새로 띄울 때는 시스템으로부터 새로 띄울 액티비티에 전달할 인텐트를 전달 받아 처리한다.
그런데 액티비티를 재사용할 때는 시스템으로부터 인텐트를 어떻게 받을 수 있을까???
onCreate() 메서드는 액티비티가 생성될 때 한 번만 호출되므로, 액티비티를 재사용할 경우에는 onNewIntent() 메서드를 재정의하여 인텐트를 처리한다. onNewIntent() 메서드는 액티비티가 이미 객체로 만들어져 있을 때 시스템으로부터 자동으로 호출되며, 파라미터로 인텐트 객체를 전달 받을 수 있다.
2. launchMode 속성 설정
- 액티비티를 등록하는 AndroidManifest.xml 파일에서 해당 액티비티의 launchMode 속성 설정
- launchMode 속성 값으로는 standard, singleTop, singleTask, singleInstance를 지정
1. standard
인텐트가 발생하면 매번 액티비티를 생성하고, 태스크 목록에 반복해서 올리겠다는 의미
<activity android:name = ".OneActivity" android:launchMode="standard"></activity>
2. singleTop
실행하려는 액티비티가 태스크의 최상단에 있으면 다시 생성하지 않겠다는 의미
<activity android:name = ".OneActivity" android:launchMode="singleTop"></activity>
3. singleTask
이전 스택 목록을 사용하지 않고 새로운 스택 목록을 만들어 그곳에 액티비티 정보를 저장
<activity android:name = ".OneActivity" android:launchMode="singleTask"></activity>
4. singleInstance
이전 스택 목록을 사용하지 않고 새로운 스택 목록을 만들어 그곳에 액티비티 정보를 저장
singleTask와 다른점은 singleInstance가 설정된 액티비티 혼자 하나의 스택을 차지하게 되어 이후 수행되는 컴포넌트들이 다시 다른 스택에 쌓인다.
<activity android:name = ".OneActivity" android:launchMode="singleInstance"></activity>
이상으로 포스팅을 마칩니다. 감사합니다.
참고자료
2018, 정재곤, “Do it! 안드로이드앱프로그래밍(개정5판)
이지스퍼블리싱(주) 2019,안드로이드 withKotlin 앱프로그래밍가이드, Icox
2018, 강성윤, “깡샘의안드로이드프로그래밍“, 루비페이퍼
2014, 정재곤, 자바+안드로이드기술, 길벗
댓글