2.1.1. 액티비티란?
AppCompatActivity는 액티비티를 상속하며, 액티비티를 상속함으로써 머터리얼 디자인(Material Design)의 가이드라인에 따른 AppCompat 라이브러리를 제대로 활용할 수 있습니다.
AppCompatActivity를 상속할 수 없을 때는 다음과 같이 android.support.v7.app.AppCompatDelegate
를 이용합니다.
public class MainActivity extends Activity {
AppCompatDelegate mDelegate;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mDelegate = new AppCompatDelegate(this);
mDelegate.setContentView(R.layout.activity_main);
}
}
2.1.2 액티비티의 수명주기를 이해하자
액티비티의 수명주기 종류
메서드명 | 시점 | 처리 예 |
---|---|---|
onCreate | 생성 시 | 초기화 처리와 뷰 생성(setContentView 호출) 등 |
onStart | 비표시 시 | 통신이나 센서 처리를 시작 |
onRestart | 표시 시 (재시작만) | (보통 아무것도 하지 않는다) |
onResume | 최전면 표시 | 필요한 애니메이션 실행 등의 화면****갱신 처리 |
onPause | 일부 표시(일시정지) 상태 | 애니메이션 등 화면 갱신 처리를 정지 또는 일시정지할 때 필요 없는 리소스를 해제하거나 필요한 데이터를 영속화 |
onStop | 비표시(정지) 상태 | 통신이나 센서 처리를 정지 |
onDestroy | 폐기 시 | 필요없는 리소스를 해제, 액티비티 참조는 모두 정리한다. |
Android N 부터 멀티윈도우가 도입되어 멀티윈도우를 지원하는 경우 애니메이션 실행 등 화면 갱신 처리의 정지는 onStop에서 합니다.
디바이스 설정의 갱신 참지
액티비티는 디바이스 설정에 변경이 발생하면 기본적으로 시스템에서 현재 액티비티를 폐기하고 새로 생성합니다. 예를 들어, 화면을 회전하거나 언어 설정을 변경하거나, 단말기 SIM 교체에 따른 전화번호 변경 등 디바이스 설정이 변경된 경우
액티비티를 재생성할 때 현재 상태를 일시적으로 저장하고 싶은 경우, onSaveInstanceState/onRestoreInstanceState라는 콜백 메서드를 사용합니다.
2.1.3 액티비티의 백스택을 이해하자
새로운 액티비티가 시작되면 실행 중이던 액티비티는 백스택에 들어갑니다.
또한 시작한 액티비티는 태스크
라는 그룹에 속합니다.
- 같은 앱에서 시작된 액티비티는 같은 백스택에 쌓인다.
- taskAffinity의 속성에 따라 소속되는 태스크가 달라진다.
- launchMode에 따라 액티비티 생성의 여부, 새로운 태스크에 속하는 등 액티비티의 시작이 달라진다.
taskAffinity
- taskAffinity는 태스크 친화성이라는 의미지만, 대체로
"태스크 이름"
으로 바꿔 읽는 것이 이해하기 쉽습니다. - taskAffinity가 지정되지 않은 경우는 자기 앱의 패키지 이름이 태스크 이름이 됩니다.
- taskAffinity를 설정하지 않으면 그 앱의 taskAffinity(태스크 이름)은 모두 같아집니다.
launchMode
launchMode | 내용 |
---|---|
standard | 매번 액티비티의 인스턴스를 새로 생성한다. (기본값) |
singleTop | 같은 액티비티가 최상위에서 실행 중이면 액티비티를 생성하지 않고, 그 대신 최상위 인스턴스의 onNewIntent()를 호출한다. |
singleTask | 1개의 태스크에 인스턴스가 존재한다. 이미 같은 액티비티가 실행 중이면 액티비티를 생성하지 않는다. |
singleInstance | 1개의 태스크에 1개의 인스턴스만 존재한다. 다른 액티비티를 태스크에 포함하지 않는다. 이미 같은 액티비티가 실행 중이면 액티비티를 생성하지 않는다. (기본적으로 사용하지 않는다.) |
singleTask는 브라우저 앱이나 게임 앱 등 여러 액티비티를 만들고 싶지 않을 때 사용합니다
백스택 확인 (adb)
adb shell dumpsys activity activities
singleTask, singleInstance로 설정한 경우, startActivityForResult()를 호출해 다른 앱과 연계할 수 없습니다.
이때는 곧바로 Activity.RESULT_CANCELED가 반환되어 취소로 다루게 됩니다.
Notice: 이 글은 [안드로이드 개발 레벨업 교과서]를 스터디하면서 정리한 내용입니다.