본문 바로가기
이과/JAVA 안드로이드

[안드로이드]액티비티의 생명주기

by 코딩초밥 2021. 5. 14.
반응형

안녕하세요 코딩초밥입니다 ㅇㅅㅇ

액티비티의 생명주기의 계념에 대해 이야기해볼까요?

4대 컴포넌트 중 중요한 요소

액티비티'Activity'

서비스'Service'

콘텐트 제공자'Content provider'

방송수신자'BroadCastreceiver'

 

 

안드로이드 앱은 4개 이 컴포넌트 조합으로 개발합니다.

이중 이용 빈도가 제일 높고

사용자와 애플리케이션이 상호작용하는 단일 화면 '액티비티'를 다루어 이야기해보겠습니다.

액티비티에는 생명주기가 복잡한 컴포넌트인데요

저는 처음 android를 접했을 때 이게 왜 필요한가!! 생각했지만

각종 상태 변화와 재분배를 통해서 더욱 다양한 함수를 이용해야 뜻하지 않는 에러를 발생 안 하고

애플리케이션 만드는데 더욱 편해집니다

액티비티는 실행부터 종료까지 많은 상태 변화를 거치며

생명주기 함수가 자동으로 호출이 됩니다.

액티비티의 상태에는 '활성상태' '일시정지 상태' 비활성 상태'가있습니다.

 

 

1. 활성상태

setContentView() 함수를 이용하여 액티비티 화면을 출력한다고 이야기들 하나

정확하게 이야기하자면 onResum() 함수까지 실행하고, setContentView() 함수에서 출력한 내용이 화면에 나오게 되는 구조입니다.

따라서 setContentView() 함수를

onCreate(), onStart(), onResume() 함수 어디선가 호출해 주면 화면이 잘 나옵니다

반대로 onResume() 함수가 호출될 때까지 setContentView() 함수가 한 번도 호출되지 않는다면 화면에 아무것도 나오지 않습니다.

setContentView() 함수를 반복해서 호출하면 어떻게 되나요?

호출은 가능하나 출력되는 건 맨 마지막 호출된 내용입니다.

setContentView()는 화면을 지우면서 새로운 내용을 출력하는 함수이기 때문입니다. 고로 에러가 안 납니다.

 

 

| 액티비티의 생명주기(Life cycle)

| 표 설명

 

oncreact()

Activity가 처음 만들어질 때 호출되는 함수이면서, 애플리케이션이 처음 시작할 때 최초로 한번 실행되는 함수입니다 주로 view를 만들거나 view resource bind, data to list 등을

oncreat에서 담당하며 이전 상태의 정보를 담고 있는 bundle을 제공합니다.

onstart()

Activity가 다시 시작되기 전에 호출, Activity가 멈춘 후 호출되는 함수, Activity가 사용자에게 보이기 직전에 호출되는 함수입니다.

onResume()

Activity가 비로소 화면에 보이는 단계, 사용자에게 focus를 잡은 상태

onRestart()

Activity가 멈춰있다가 다시 호출될 때 불리는 함수입니다, 즉 Stopped 상태였을 때 다시 호출되어 시작될 때 불립니다.

onPause()

Activity 위에 다른 Activity가 올라와서 focus를 잡은 상태입니다

완전 액티비티가 가려지지 않은 상태에서 호출되는 함수입니다

즉 일부분이 보이거나 투명 상태일 경우 호출됩니다

다른 액티비티가 호출되기 전에 실행되기 때문에

주의!

onPause() 함수에서 시간이 많이 소요되는 작업이나

많은 일을 처리하면,

다른 Activity가 호출되는 시간이 지연되기 때문에 많은 일을 처리하면 느리게 보일 수 있다.

onStop()

액티비티 위에 다른 액티비티가 완전히 올라와 화면에서 100% 가려질 때 호출되는 함수입니다.

홈 키를 누르는 경우 또는 다른 액티비티 페이지 이동이 있는 경우. 만약 이 상태에서 액티비티가 다시 불리려면

ONRestart() 함수가 호출됩니다

onDestroy()

액티비티가 완전히 스택에서 없어질 때 호출되는 함수, 즉 제거되는 경우

finish() 메서드가 호출되거나, 시스템 메모리 확보를 위해 호출됩니다.


2. 일시정지 상태

일시정지 상태는 액티비티가 여전히 화면에 보이지만 포커스를 잃을 상태입니다.

다이얼로그 스타일로 액티비티가 실행되고 뒤에 있는 액티비티는 반투명으로 포커스를 잃은 장면을 볼 수 있을 텐데요

대표적으로 그런 것입니다.

대부분 정지 상태(onStop)로 전환되기 전에 호출되어 곧 정지될 것을 나타내기 위해 사용되며

일시정지 상태가 되면 onPause() 함수가 자동으로 호출됩니다.

 

 


 

3. 비활성화 상태

다른 화면으로 가려진 상태를 비활성화 상태라 부릅니다.

이렇게 되면 onPause() -> onstop() 함수까지 호출됩니다.

화면을 가렸던 액티비티가 뒤로 가기 비활성 상태에서 뒤로 가기 버튼 등으로 다시 활성상태로 전환되는데요

이때는 onRestart()-> onstart()-> onResume() 함수가 차례대로 호출됩니다.

액티비티 내에 많은 데이터가 유지되어 화면에 출력되지만. 액티비티가 종료되면 모두 유실이 됩니다

하나 다시 켜지면 다시 보여주고 싶은 자료들이 있죠?

db에 저장시키는 데이터의 영속화 이야기가 아닙니다.

액티비티가 종료되었을 때 데이터를 저장하는 방법이 아닌

액티비티 종료에 대비하는 데이터 저장입니다.

액티비티 종료 후 다시 실행 시 순서

onPause() - > onStop() -> onDestory() -> onCreat() -> onStart() - > onResum()

하나 이렇게 하면 안에 있는 데이터는 당연히 유실됩니다.

 


액티비티가 종료될 때 유실되면 안 되는 데이터를 저장했다가 다시 액티비티가 시작될 때 복원하여

사용하기 위한 생명주기 함수를 써보겠습니다

onPause() - > onSaveInstanceState() -> onStop() -> onDestory() -> onCreat() -> onStart() - > onRestoreInstanceState() -> onResum()

액티비티의 상태를 관리를 위해 데이터를 저장했다가 복원하는데 사용되는 함수

onRestoreInstanceState(), onSaveInstanceState()입니다

액티비티가 종료되는 상황에 대비하여서 데이터를 저장해야 한다면 onSaveInstanceState() 함수를 이용합니다

 

onSaveInstanceState()onPause() 다음으로 자동으로 호출되며 이 함수에서 액티비티의 데이터를 저장합니다. 저장하는 방법은 매개변수로 전달되는 Bundle을 이용하면 됩니다.

Bundle은 컴포넌트의 데이터를 저장하기 위한 일종에 Map 객체이며, 이 객체에 데이터를 key-value로 담아주면

내부적으로 파일을 저장해 주어서 액티비티가 종료돼도 원하는 데이터를 가져올 수 있습니다.

반응형

댓글