Activity?
- 화면에 표시되는 ui를 그리는 기본 요소
- 하나의 앱은 UI를 그리기 위해 최소 하나의 activity를 필요로 한다.
- 앱의 activity를 사용하기 위해서는 manifest 설정 파일에 등록이 필요하다.
JetPack
- 안드로이드 플랫폼이 기본으로 제공하는 플랫폼 API 외에 따로 추가된 라이브러리
- jetpack의 목적
- 앱을 개발하는데 필요한 권장 아키텍처 제공
- API f레벨 호환성 문제 해결
- 플랫폼 API에서 제공하지 않는 다양한 기능 제공
Appcompat library
- jetpack에서 제공되는 라이브러리 중 하나
- 안드로이드 앱의 화면을 구성하는 액티비티를 만들며, api 레벨의 호환성 문제를 해결해 준다.
- api 레벨 호환성 문제
- 우리가 각종 라이브러리를 활용하여 개발하는데 있어 과거 android os에서 지원하던 클래스들이 보안 문제 등으로 인해 더 이상 현재는 지원되지 않을 때가 종종 있다.
- 또는 새로운 라이브러리들이 등장하면서 더 효율적인 클래스들을 사용하며 라이브러리 구조 자체가 바뀌게 된다.
- 하지만 우리는 더 폭넓은 안드로이드 level을 지원 할 수록 더 많은 사용자가 이용할 수 있다.
- 위의 차이로 인해 각 api level에 맞는 앱을 개발하는 것은 매우 비효율적이다.
- 이에 따른 문제점을 해결해주는 것이 appcompat library이다.
- api 레벨 호환성 문제
- 이 library를 통해 앱이 다양한 플랫폼 버전에서 훨씬 일관적인 경험을 제공할 수 있다.
🎯 AppcompatActivity
안드로이드 공식 문서: AppcompatActivity
- 안드로이드 하위버전을 지원하는 activity의 일종
- 공식 문서에 따르면 다음 3가지를 특징으로 삼는다.
- setSupportActionBar(Toolbar) API를 사용하여 action item, navigation mode 등을 포함하는 action bar를 지원합니다.
- Theme.AppCompat.DayNight 테마를 사용하며 AppCompatDelegate.setDefaultNightMode(int) API를 사용하여 다크 모드를 지원합니다.
- getDrawerToggleDelegate() API를 사용하여 DrawerLayout과 통합합니다.
- 더 다양한 기종을 지원하고 더 다양한 기능을 이용할 수 있다.
Activity 생명 주기
- activity의 상태는 크게 3가지로 구분할 수 있다.
- 활성: 액티비티 화면이 출력되고 있고, 사용자가 이벤트를 발생시킬 수 있는 상태
- onCreate() -> onStart() -> onResume() 함수까지 호출
- 일시 정지: 액티비티 화면이 출력되고 있지만, 사용자가 이벤트를 발생 시킬 수 없는 상태
- onPause() 함수까지 호출
- 비활성: 액티비티의 화면이 출력되고 있지 않는 상태
- onResume() -> onPause() -> onStop() 함수까지 호출
- 다시 활성상태가 되면 onRestart() -> onStart() -> onResume()으로 호출됨
- 활성: 액티비티 화면이 출력되고 있고, 사용자가 이벤트를 발생시킬 수 있는 상태
- onDestroy() 함수가 호출되는 시점은 Activity의 생명이 끝났음을 의미
- 🎯 왜 LifeCycle을 신경써야 할까?
- Activity 및 Fragment와 같은 다른 Component의 LifeCycle 상태 변경에 따라 작업을 실행
- 이러한 Component를 사용하면 잘 구성된 경량 코드를 만들어 유지 관리가 더 쉬워짐
🎯 LifeCycle 패러다임과 활용
- onCreate()
- 최초 실행 시에만 해줘야 하는 작업
- View를 생성하는 단계
- Data Binding, Layout 정의
- onStart()
- 화면에 진입할 때마다 실행되는 작업
- UI를 관리하는 코드를 초기화
- onStop()에서 해제된 리소스 초기화
- onCreate() 직후 실행되는 메소드
- 활용
- DrawerLayout 화면닫기
- 로그인 화면에서 돌아왔을 때 화면 갱신
- onResume()
- 사용자에게 보이는 동안 실행해야 하는 작업
- onPause()에서 해제된 리소스 초기화
- 화면이 재개됨 상태로 전환 될 때마다 필요한 다른 초기화 작업
- 활용
- 카메라 미리보기
- onPause()
- 사용자가 Activity에서 떠나게 될 때 작업
- 잠시 후 다시 시작할 작업을 일시정지 or 조정
- 배터리 수명에 영향을 미칠 수 있는 리소스 해제
- 활용
- GPS, Thread 중지, 카메라 미리보기 정지 등
- 게임의 전화왔을 때의 일시정지
- onPause와 onStop의 차이는 링크에서 잘 비교가 되어있다.
- 현재 activity가 조금이라도 남아있다면, onPause까지만 진행된다.
- 하지만, 현재 Activity가 완전히 사라진다면 onStop까지 호출된다.
- onStop()
- 사용자에게 보이지 않고, Activity가 완전히 가려질 때의 작업
- 필요하지 않은 리소스를 해제 or 조정
- 비교적 부하가 큰 저장 작업
- 정보를 데이터베이스에 저장
- 새로운 activity를 호출한다면 여기까지 호출된다.
- 활용
- 사용자의 데이터 정보를 로컬 디비에 저장
- onDestroy()
- 액티비티가 소멸되기 전에 정리하는 작업
- 해제되지 않은 모든 리소스 해제
- 활용
- MediaPlayer 등 해제되지 않은 리소스 해제
Activity 전환
- Activity를 전환하는 것은 새로운 Activity를 생성하고 현재 화면에 새 Activity를 띄우는 것으로 진행된다.
- startActivity() 메소드를 통해 생성한 intent를 전달해주며 새 activity로 전환한다.
- 우리는 이때 여러 방법으로 액티비티 태스크가 생성되는 것을 제어할 수 있다.
태스크 제어
- activity 태스크는 4개의 모드로 관리할 수 있다.
- standard: 여러 개의 인스턴스가 생성 가능하다.
- Standard로 발생 시 항상 객체가 생성되고 같은 앱 태스크에 올라간다.
- A activity 위에 B activity가 있을 때 B를 생성한다면, A-B-B로 태스크에 올라감
- singleTop: 호출한 activity와 현재 top activity가 동일한 경우 최상위 activity가 재사용 된다
- 기존 최상위 activity는 pop
- A activity 위에 B activity가 있을 때 B를 생성한다면, A-B로 태스크에 올라감
- singleTask: 루트 액티비티로만 존재하며 하나의 인스턴스만 생성 가능
- 다른 액티비티 실행시 동일 Task내에서 실행이 가능하다
- 새로운 Task를 만들어 그 Task에 새 activity를 생성함
- A activity 위에 B activity가 있을 때 B를 생성한다면 A-B / B 로 존재한다.
- singleInstance: 루트 액티비티로만 존재하며 하나의 인스턴스만 생성가능하고 태스크 내에 해당 액티비티 하나만 속할 수 있어 다른 액티비티를 실행시키면 새로운 Task가 생성되어 그 Task내에 포함된다
- A activity 위에 B activity가 있을 때 B를 생성하고 그 위에 C activity를 생성한다면 A-B / B / C로 존재한다.
- standard: 여러 개의 인스턴스가 생성 가능하다.
- 두 가지 방식으로 관리할 수 있다.
- manifest에 설정
- <activity android:launchMode= “사용하고자 하는 속성”/>
- intent에 flag를 담아 startActivity로 실행
- intent.addFlags(Intent.사용하고자 하는 flag)
- manifest에 설정
🎯 startActivity()
- activity를 생성하고 실행하는 메소드
- intent에 전달할 정보를 담고 이 메소드를 이용해 activity를 실행한다.
- 이때, intent에 현재 자신의 context와 실행할 activity 클래스를 담아주어야 한다.
- 또한 intent flag를 통해 실행할 activity의 태스크를 제어할 수 있다.
- 4개의 모드로 실행