Activity?

  • 화면에 표시되는 ui를 그리는 기본 요소
  • 하나의 앱은 UI를 그리기 위해 최소 하나의 activity를 필요로 한다.
  • 앱의 activity를 사용하기 위해서는 manifest 설정 파일에 등록이 필요하다.

JetPack

  • 안드로이드 플랫폼이 기본으로 제공하는 플랫폼 API 외에 따로 추가된 라이브러리
  • jetpack의 목적
    • 앱을 개발하는데 필요한 권장 아키텍처 제공
    • API f레벨 호환성 문제 해결
    • 플랫폼 API에서 제공하지 않는 다양한 기능 제공

Appcompat library

  • jetpack에서 제공되는 라이브러리 중 하나
  • 안드로이드 앱의 화면을 구성하는 액티비티를 만들며, api 레벨의 호환성 문제를 해결해 준다.
    • api 레벨 호환성 문제
      • 우리가 각종 라이브러리를 활용하여 개발하는데 있어 과거 android os에서 지원하던 클래스들이 보안 문제 등으로 인해 더 이상 현재는 지원되지 않을 때가 종종 있다.
      • 또는 새로운 라이브러리들이 등장하면서 더 효율적인 클래스들을 사용하며 라이브러리 구조 자체가 바뀌게 된다.
      • 하지만 우리는 더 폭넓은 안드로이드 level을 지원 할 수록 더 많은 사용자가 이용할 수 있다.
      • 위의 차이로 인해 각 api level에 맞는 앱을 개발하는 것은 매우 비효율적이다.
      • 이에 따른 문제점을 해결해주는 것이 appcompat library이다.
  • 이 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 lifecycle

  • 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로 존재한다.
  • 두 가지 방식으로 관리할 수 있다.
    1. manifest에 설정
      • <activity android:launchMode= “사용하고자 하는 속성”/>
    2. intent에 flag를 담아 startActivity로 실행
      • intent.addFlags(Intent.사용하고자 하는 flag)

🎯 startActivity()

  • activity를 생성하고 실행하는 메소드
  • intent에 전달할 정보를 담고 이 메소드를 이용해 activity를 실행한다.
  • 이때, intent에 현재 자신의 context와 실행할 activity 클래스를 담아주어야 한다.
  • 또한 intent flag를 통해 실행할 activity의 태스크를 제어할 수 있다.
    • 4개의 모드로 실행

'Android > Android 기초' 카테고리의 다른 글

Json & Gson  (0) 2022.04.18
Android: Fragment  (0) 2022.03.23
Android: Data Class  (0) 2022.03.23
Android: Binding  (0) 2022.03.23
Android: Intent  (0) 2022.03.23
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기