Activity life cycle

yeji·2021년 1월 6일
0

Android 공부

목록 보기
1/6

Activity Overview

manifest 구성

activity 선언

  • activity를 사용하기 위해 속성 선언이 필요하다.
    • 필수 속성
      • android:name
      • ex: <activity android:name=".SecondActivity" />

intent-filter 선언

  • AndroidManifest.xml에서는 암시적 인텐트조건에 부합하는 action을 찾아 처리 한다.
  • 예시
    • 지도에 있는 한 위치를 표시하고 싶을 때, 지도보기기능이 있는 앱이 지정된 위치를 지도에 표시하도록 요청 가능
    • 특정 작업을 할 수 있는 앱을 찾아야 할 때 사용 한다!
  • 실행 과정
    • 암시적 인텐트를 사용하기 위해 인텐트의 내용을 기기에 있는 다른 여러 앱의 manifest 파일에서 선언된 <intent-filter>와 비교한다!
    • 해당 인텐트와 일치하는 인텐트 필터 조건이 있다면 시스템에서 해당 Component를 실행하고 Intent 객체를 전달한다.
  • 사용
    • 필수
      1. <action> 요소 : 해당 action이 데이터를 전송하도록 지정
        • 속성 : android:name
        • 상수 : ACTION_string
        • 표준
          • ACTION -> android.intent.action. 를 접두사로 사용
          • stringMAIN이라면 -> android.intent.action.MAIN
          • stringACTION_WEB_SEARCH라면 -> android.intent.action.WEB_SEARCH
          • 직접 정의한 action인 경우, TRANSMOGRIFY 작업을 정의한다면 -> 패키지 이름을 접두사로 사용 <action android:name="com.example.project.TRANSMOGRIFY" />
    • 선택
      2. <category> 요소 : 실행 요청을 수신
      3. <data> 요소 : 이 action이 전송할 수 있는 데이터 유형

cf. Intent

  • 명시적 인텐트로 activity나 service와 같은 컴포넌트가 특정 컴포넌트를 지명하고, 인텐트라는 택배 박스에 정보들을 담아 보내는 것이다.
    • Activity 시작
      • Activity의 새 인스턴스를 시작하려면 Intent를 startActivity()로 전달
      • Activity가 완료 되었을 때 Return 값을 받고 싶다면 startActivityForResult()를 사용
      • Intent는 시작할 activity의 정보와 모든 필수 데이터를 담고 있는 택배 박스 같은 역할이다.
    • Service 시작
      • 파일 다운로드와 같은 일회성 작업을 시작하려면 IntentstartService()에 전달
      • Intent는 시작할 service의 정보와 모든 필수 데이터를 담고 있다.
      • Android 5.0(API 21) 이상부터 JobScheduler로 서비스 시작 가능
      • Android 5.0(API 21) 이하 버전은 Service 클래스의 method를 사용하여 서비스 시작 가능
      • 주의 : Service에서는 항상 명시적 인텐트 사용해야 한다. 암시적 인텐트를 사용하면어느 서비스가 응답할지 확신할 수 없기에 앱의 보안이 보장되지 않기 때문!
    • Broadcast 전달
      • 다른 앱에 기기가 충전을 시작함을 알리는 것과 같은 시스템 이벤트 메세지를 전달하기 위해IntentsendBroadcast() 또는 sendOrderedBroadcase()으로 Broadcast를 전달

life cycle callback methods

  • 상태에 따른 기능을 적용하는 callback methods
    • onCreate()
    • onStart()
    • onResume()
    • onPause()
    • onStop()
    • onRestart()
    • onDestroy()

onCreate()

  • 시점
    • 시스템이 activity를 Created 하기 위해 호출
  • 구현
    • activity의 필수 컴포넌트를 초기화
      • ex. setContentView()로 레이아웃 정의
    • Bundle 상태가 null이면 인스턴스 복원하지 않고 새 인스턴스 생성, null이 아니라면 savedInstanceState를 읽어 이전에 소멸된 activity의 인스턴스를 복원
  • 다음 callback
    • onCreate() -> onStart()

onStart()

  • 시점
    • onCreate()가 종료될 때 호출
  • 구현
    • activity가 forground로 전환되어 상호작용을 위한 최종 준비
  • 다음 callback
    • onStart() -> onResume()

onResume()

  • 시점
    • activity가 사용자와 상호작용하기 위해 호출
    • 어떤 이벤트(전화, 다른 액티비티 실행, 기기화면 꺼짐 등)가 발생하여 앱에서 focus가 떠날 때까지 앱이 이 상태에 머무른다.
  • 구현
    • forground에서 사용자에게 보이는 동안 실행해야 하는 모든 기능을 활성화 가능 (ex. 카메라 미리보기 시작)
  • 다음 callback
    • onResume() -> onPause()
      • ⭐다른 Activity는 항상 현재의 onResume()이 끝나야 onPause()를 부를 수 있다!!⭐

onPause()

  • 시점
    • activity가 focus를 잃었을 때 호출
      • ex 1. 뒤로가기 버튼 또는 최근 버튼을 탭했을 때
      • ex 2. 알림이나 다이얼로그가 떴을 때 뒤에 희미하거나 부분적으로 보일 때
      • ex 3. Android 7.0(API 24) 이상에서는 여러 앱이 멀티 윈도우 모드에서 실행된다. 언제든지 그중 하나의 앱만 focus를 가질 수 있기에 시스템이 그 외에 모든 다른 앱을 Paused 상태로 만든다.
  • 구현
    • 배터리 수명에 영향을 미칠 수 있는 모든 리소스 해제 가능!
      • 리소스, 센서핸들(ex. GPS)
    • 그러나 onPause()로 일시중지된 활동은 멀티 윈도우 모드에서 여전히 완전히 보이는 상태일 수 있다. 그러므로 멀티 윈도우 모드를 더욱 잘 지원하기 위해 UI관련 리소스와 작업을 완전히 해제하거나 조정할 때는 onPause() 대신 "onStop()"을 사용하는 것이 좋다.
    • DON'T 데이터 저장, 네트워크 호출, 데이터베이스 트랜잭션은 onPause()에서 실행 하지 말아야 한다!!
      • onPause()는 아주 잠깐 실행되므로 저장 작업을 실행하기에는 시간이 부족하다. 그 대신, ⭐부하가 큰 종료 작업은 onStop()일 때 실행해야 한다.⭐
  • 다음 callback
    • onPause() -> onStop()
    • onPause() -> onResume()

onStop()

  • 시점
    • activity가 사용자에게 더 이상 표시되지 않을 때 호출
    • activity를 제거 중이거나 새 activity가 시작되는 중인 상태를 가질 때 발생할 수 있다.
  • 구현
    • 영구 데이터 저장 (ex. 사용자 기본 설정, 데이터베이스 데이터)
  • 다음 callback
    • onStop() -> onRestart()
    • onStop() -> onDestroy()

onRestart()

  • 시점
    • Stopped 상태를 가진 activity를 다시 시작하려고 할 때 호출
  • 구현
    • activity가 중지된 시간부터 activity 상태를 복원
  • 다음 callback
    • onRestart() -> onStart()

onDestroy()

  • 시점
    • activity가 소멸되기 전에 호출
      • ex 1. 사용자가 activity를 완전히 닫거나 finish()가 호출되어 activity가 종료되는 경우
      • ex 2. 기기회전 또는 멀티 윈도우 모드로 인해 시스템이 일시적으로 activity를 소멸시키는 경우
  • 구현
    • 이전의 callback에서 아직 해제되지 않은 모든 리소스(ex. onStop())를 해제
    • ex.onCleared()를 호출하여 모든 데이터를 정리

references:
https://developer.android.com/guide/components/activities/intro-activities?hl=ko
https://developer.android.com/guide/components/activities/activity-lifecycle
https://developer.android.com/guide/components/intents-filters?hl=ko

profile
🐥

0개의 댓글