본문 바로가기
프로그래밍/개발지식

컴맹도 이해하는 안드로이드 생명주기

by 감웅 2020. 3. 22.
반응형

안녕하세요 감웅입니다! 이번 포스트는 제가 최근에 공부했던 안드로이드 생명주기에 대해서 최대한 쉽게 설명을 해보려 합니다. 글의 목적은 전반적으로 이런 흐름이구나~ 라고 파악하는데 있고요. 정석으로 알고싶으신분은 맨 아래 공식 Android Devloper 링크를 걸어두었으니 거기서 완전히 지식을 체화하시면 될것같습니다!

이런 포스트가 처음이니 미숙하더라도 귀엽게 봐주세요~ 피드백은 환영합니다 :)

 

안드로이드 생명주기

위의 그림은 Activity 라이프사이클인데요. 공식문서에서 캡쳐해왔습니다.

참고로 위 그림을 보고 다 이해가 되시는 분들은 이 글을 읽으실 필요가 없습니다!

해당 포스트는 위의 플로우차트를 최대한 쉽게 표현하는데에 중점을 두었습니다. 그럼 포스트 시작하겠습니다.

 

제목을 안드로이드 생명주기라 썼지만 정확한 표현은 'Activity 수명주기' 가 정확한 표현입니다. 'Activity'란 뭘까요?

단어 자체의 뜻은 '활동'이란 뜻입니다. 무슨 활동일까요? 앱을 구동시켜주는 활동입니다 

 

근본적으로 앱 구동이라는 것은 cpu가 메모리에 해당앱에 대한 명령어들을 적재시키고 하나씩 실행하는 것입니다.

예를들어 우리가 '계산기 앱'을 만들어서 우리 핸드폰에 설치를 하고 앱을 실행시킨다는 것은 핸드폰 메모리에

그 앱에 대한 명령어들이 들어있고 cpu는 그걸 하나하나 읽어서 실행시키는 것이 되겠죠~

 

그러면 여기서 드는 궁금증은 앱의 실행순서는 어떻게 될까요? 생각나는 순서데로 적어보면..

1. 앱이 어떻게 생겨먹었는지에 대한 정보를 가지고 있는 문서를 cpu가 읽는다. (앱의 설계도를 읽는다)

2. cpu는 밑작업을 하고 그림을 잘그리는 그래픽 친구한테 재료와 설계도를 던져준다.

3. 설계도를 받은 그래픽 친구는 설계도데로 각 요소들을 그려준후 활력을 불어넣어준다. (요소 draw 및 기능을 추가)

4. 각 요소들은 기능이 있을수도 있다. 이걸 이용하는 손님(사용자)이 해당기능을 이용할수 있도록 알바생을 둔다.

5. 손님이 어떤 기능을 주문하면 알바생은 그걸 처리해준다.

 

이해를 돕기위해 위와같이 쉽게 적어봤는데요! 이제 차근차근 설명해보겠습니다.

1. 앱이 어떻게 생겨먹었는지에 대한 정보를 가지고 있는 문서를 cpu가 읽는다. (앱의 설계도를 읽는다)

맨 처음 앱을 클릭하고 앱이 실행되면 cpu는 가장먼저 뭘 해야할지에 대한 정보가 필요합니다. 그 정보가 들어있는곳이manifest.xml이란 친구인데요. 경로는 app/src/main/AndroidManifest.xml 에 있는 친구에요. 

내용을 봐보면~

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.calculator">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    </manifest>

이런식으로 생겼습니다. 여기서 activity안에 있는 MainActivity라는 친구 보이시죠? 앱이 실행되면 cpu는 먼저

해당파일을 읽고 '실행시켜야 될 파일'을 이 문서에서 찾게되는데요 그게 MainActivity라는 친구입니다.

만약에 저친구가 없으면 cpu는 '실행시킬 애가 없어'라고 오류가 나게되요.

그럼 MainActivity 라는 친구를 실행시킨다 라는것은 무슨의미일까요? 바로 저친구를 '객체'로 생성시켜서 사용한다는 이야기인데요. 여기서 부터는 '객체'에 대한 내용을 어느정도 이해하고 있어야 됩니다.

 

MainActivity 객체를 생성한 cpu는 이 객체의 메소드를 실행시키게 되는데요. 그 메소드의 이름은 onCreate() 라는 아이입니다. 단어만 보면 이친구는 뭔가를 생성하는 친구네요. 그게 무엇일까요? 바로 '앱'입니다. 근데.. 여러분! 어떤 작품을 만들때 그 작품에 대한 설계도가 있어야 그 작품을 만들겠죠? 마찬가지로 우리 cpu도 그 설계도가 있어야 앱을 만들수가 있어요.. 그럼 그 설계도는 어디에 있을까요? 바로 res/layout/activity_main.xml이란 친구입니다.

이 친구가 바로 앱의 설계도에요~ 

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

위의 xml은 Hello World! 예제인데요!  설계도의 내용은 'ConstraintLayout 이란 레이아웃안에 'TextView'를 배치시키고

TextView는 중앙에 뜨면서 TextView의 내용은 Hello World! 란 메시지를 띄워라' 라고 되어있네요. 그러기 위해서는 'ConstraintLayout'과 'TextView' 객체를 만들어서 이를 그림 잘 그리는 친구한테 넘겨줘야됩니다!

객체는 속성이 존재하는데요. TextView의 속성은 <TextView> </TextView> 안에 있는 내용들입니다.

예를 들자면, android:text = "Hello World!"는 TextView 객체를 생성시 해당 객체의 text라는 속성은 Hello World!라는 문자열을 바인딩해라 라는 의미입니다. 객체를 생성 후 cpu는 그림을 그리는 그래픽친구한테 도움을 요청해 그림을 그릴때 필요한 재료들(ConstraintLayout 객체와 TextView 객체)을 줍니다.

이때 onCreate()함수가 내부적으로 onStart()를 실행시킵니다. 이처럼 어떤 함수 내부에서 다른 함수를 실행시키는 경우가 있는데 이때 onCreate()라는 함수를 '콜백 함수'라고 부릅니다. 앞으로 모든함수는 콜백함수(메소드)가 됩니다.

 

2. cpu는 밑작업을 하고 그림을 잘그리는 그래픽 친구한테 재료와 설계도를 던져준다.

그림을 잘 그리는 그래픽 친구가 설계도와 재료를 받으면 일단 새하얀 화이트보드를 꺼내고 각 요소들을 해당위치에 알맞게 착착 배치하는데요. 그 전에 이 화이트보드에 낙서가 되있거나 이러면 곤란하겠죠..? 이러한 낙서를 지워주는 역할을 하는 메소드가 onStart() 입니다! 이 친구의 역할은 그림을 그리기 전에 화이트 보드를 지우는 행동을 한다고 생각하시면 편하실거에요~ 이 친구는 자신의 역할을 수행한 후 내부적으로 onResume()이라는 메소드를 실행시킵니다. 

 

3. 설계도를 받은 그래픽 친구는 설계도데로 각 요소들을 그려준후 활력을 불어넣어준다. (요소 draw 및 기능을 추가)

onResume()이라는 친구는 본격적으로 각 요소들을 배치(그림)를 하고 각각에 배치요소들에 활력(개발자가 코딩한것들)을 불어넣습니다. 그리고 손님(사용자)에게 서비스를 제공합니다.

 

4. 각 요소들은 기능이 있을수도 있다. 이걸 이용하는 손님(사용자)이 해당기능을 이용할수 있도록 알바생을 둔다.

5. 손님이 어떤 기능을 주문하면 알바생은 그걸 처리해준다.

이때, 서비스를 제공해주려면 알바생이 있어야겠죠?

이 알바생(이벤트 리스너)은 항상 손님이 어떤 주문을 시키길 기다리면서 대기하고 있다가 주문이 들어오면(버튼을 누르거나하는 등)이를 주문을 포스기에 넣고 사장님(cpu)은 주문순서데로 처리해 주게됩니다. 이때 주문내용은 개발자가

코딩한데로 동작을 하게됩니다. 

이렇게 영업을 하던도중 사용자가 다른 앱을 이용하려고 화면에 여러앱보기를 누를경우 내부적으로 onPause()라는

메소드를 실행시키게 됩니다. 해당 메소드는 잠깐 영업을 정지하고 손님의 눈치를 보는 행위를 하게되요.

 

이때, 손님은 크게 두가지 행위를 할 수 있습니다.

1. 사용하던 앱으로 돌아오기

2. 다른앱으로 전환

 

1.사용하던 앱으로 돌아오기를 선택하면 다시 영업을 시작하게되요. 메소드는 onPause()에서 onResume()으로 가게됩니다. 반대로 2. 다른앱으로 전환을 선택하면 원래 있던 앱은 영업을 중단하게 되는데 이때 onStop()을 실행시킵니다.

 

그러다가 사용자가 해당앱을 손가락을 위에서 아래로 슝~하고 날려버리면 onDestroy()를 실행시키게 되고 이로써

해당 앱은 메모리에서 사라지게 됩니다.. 

 

여기까지 앱의 생성부터 사라지는것까지 알아봤는데요. 내용을 최대한 간추릴라 했는데도 길어보이네요! 

누군가 생명주기가 이해가 안되서 제 글을 읽고 감이라도 잡으셨길 바라며.. 다음 포스트로 인사드리겠습니다.

참고로 해당 포스트는 '대략적인 감'을 잡기 위한내용이라 중간중간 빠져있는 내용이 많을거에요 그럴때에는

 

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

 

Activity 수명 주기에 대한 이해  |  Android 개발자  |  Android Developers

An Activity is an application component that provides a screen with which users can interact in order to do something, such as dial the phone, take a photo, send an email, or view a map. Each activity is given a window in which to draw its user interface…

developer.android.com

해당 링크를 타고 좀더 디테일하게 확인을 학습을 하시길 바랍니다. 저도 위에서 학습을 했습니다.. 공식문서가 짱입니다

그럼 다음 포스트에서 뵙겠습니다. 글 읽어주셔서 감사합니다 :)

댓글, 피드백 환영합니다.

 

반응형

댓글