액티비티 실행 모드 – standard
실제 프로젝트에서는 요구사항에 맞춰 각 액티비티에 적절한 실행 모드를 지정해야 합니다.
실행 모드는 총 4가지입니다:
standard, singleTop, singleTask, singleInstance
AndroidManifest.xml 파일에서 액티비티의 launchMode 속성을 설정할 수 있습니다
standard는 기본 실행 모드입니다
따로 지정하지 않으면 모든 액티비티는 이 모드를 사용합니다
이 모드에서는 새 액티비티가 항상 스택 맨 위에 위치합니다
시스템은 해당 액티비티가 스택에 이미 존재하는지 확인하지 않습니다.
실행할 때마다 액티비티의 새 인스턴스가 생성됩니다
메인 액티비티 –> 일반 액티비티 —> 메인 액티비티 실행(새 인스턴스)
새로 생성된 메인 액티비티에 대해 시스템은 기존 메인 액티비티 인스턴스를 무시합니다
이제 직접 시연해 보겠습니다
메인 액티비티에 버튼을 추가하고, 버튼 클릭 이벤트에서 Intent로 메인 액티비티를 다시 실행합니다
궁금한 점: 뒤로가기 버튼 한 번만 누르면 앱이 종료되는 것처럼 보입니다
원인이 무엇일까요?
원인을 찾으신 분은 공유해 주세요.
액티비티 실행 모드 – singleTop
액티비티를 singleTop으로 지정하면 실행 전에 백스택 최상단이 해당 액티비티인지 확인합니다. 맞다면 기존 인스턴스를 재사용하고 새 인스턴스를 만들지 않습니다.
테스트해 보겠습니다. AndroidManifest.xml에서 메인 액티비티의 launchMode 속성을 singleTop으로 설정합니다
이제 버튼을 아무리 많이 눌러도 메인 액티비티 새 인스턴스가 생성되지 않고 로그는 한 번만 출력됩니다.
뒤로가기 버튼 한 번 누르면 안드로이드 앱을 종료할 수 있습니다
하지만 액티비티가 스택 최상단에 있지 않다면 새 인스턴스가 생성될 수 있습니다
Intent를 수정해서 먼저 다른 액티비티를 열고,
두 번째 액티비티에서 메인 액티비티를 실행합니다.
두 번째 액티비티 화면에서는 스택 최상단이 메인 액티비티가 아니므로 이 경우 메인 액티비티 새 인스턴스가 생성됩니다.
I/Choreographer: Skipped 37 frames! The application may be doing too much work on its main thread.Code language: HTTP (http)
지난 두 차시 강의: 뒤로가기 누르면 바탕화면으로 나가는 문제
버튼 이벤트 안에 finish(); 코드를 추가로 적었기 때문에 발생한 문제입니다
Log.e(TAG, this.toString()); 현재 액티비티의 메모리 주소를 출력하는 코드
singleTask 모드
singleTask를 사용하면 앱 전체에서 해당 액티비티 인스턴스가 단 하나만 유지됩니다.
반면 singleTop은 스택 최상단일 때만 인스턴스가 하나임을 보장합니다.
singleInstance 모드와 태스크 Task
이 모드에서는 시스템이 별도의 백스택을 생성해서 이 액티비티를 관리합니다
예시: 액티비티가 3개 있고 두 번째 액티비티의 launchMode를 singleInstance로 설정하면 두 번째 액티비티는 별개의 백스택으로 관리됩니다.
첫 번째 액티비티에서 두 번째로 이동하고, 다시 두 번째에서 세 번째 액티비티로 이동합니다.
세 번째 액티비티에서 뒤로가기를 누르면 첫 번째 액티비티로 돌아갑니다. 첫 번째와 세 번째는 동일한 백스택에 속하기 때문입니다.
첫 번째 액티비티에서 다시 뒤로가기를 누르면 두 번째 액티비티로 전환됩니다. 첫 번째 액티비티의 스택은 비었으므로 시스템은 다른 태스크 스택의 최상단인 액티비티2로 이동합니다. 한 번 더 뒤로가기를 누르면 홈 화면으로 나갑니다.
public void onClick(View view){
Intent it = new Intent(NormalActivity.this,Activity3.class);
startActivity(it);
finish();
}Code language: JavaScript (javascript)
05-13 08:14:26.890 4746-4746/com.foxdevelop.www.lifedemo E/메인 액티비티: 113
05-13 08:14:33.755 4746-4746/com.foxdevelop.www.lifedemo E/일반 액티비티: 114
05-13 08:14:37.932 4746-4746/com.foxdevelop.www.lifedemo E/세 번째 액티비티: 113
액티비티 실행 모드