불로구

[코틀린 / 안드로이드] - 안드로이드 생명주기(1) 본문

프로그래밍/코틀린 안드로이드

[코틀린 / 안드로이드] - 안드로이드 생명주기(1)

맹이맹이 2021. 2. 14. 22:27
반응형

액티비티의 생명주기

- 액티비티는 onCreate() 콜백 함수 외에도 메인 스레드가 제어하기 위한 여러 콜백함수를 호출한다.

액티비티 생명주기

- 이 함수들은 메인 스레드의 명령 이벤트에 따라 호출되기 때문에 콜백 함수라고 한다.

- onCreate() 함수는 액티비티가 생성될 대 호출되고 반드시 구현해야 한다.

- onPause() 함수는 애플리케이션이 다른 것에 의해 가려진 경우 호출되며, 애플리케이션의 일시 중단을 나타낸다.

- onResume() 함수는 onPause()에 의해 일시중단 된 것을 다시 재개된다.

- onDestory() 함수는 [back]키를 연속해서 누르다 백 스택에 액티비티가 없거나, 안드로이드 시스템에 의해 리소스가 부족하면 강죄종료 되며 호출된다.

- 액티비티가 갑자기 종료되면 액티비티가 가진 데이터가 사라질 경우를 대비하여

  onSaveInstanceState()와 onRestoreInstanceState()를 오버라이딩해 상태를 저장하고 복구해야 한다.

 

프래그먼트의 생명주기

- 화면의 작은 단위인 프래그먼트의 생명주기는 택티비티와 비슷하지만 몇 단계의 콜백함수가 더 있다.

- onAttach() : 액티비티에 프래그먼트 추가

- onDetach() : 프래그먼트 제거

- onCreateView() : UI를 구성하는 View 반환

- onActivityCreated() : 완전하게 UI가 구성된 다음에 나머지 동작 코드 구성

 

안드로이드 콜백 함수에 lateinit 사용

- 안드로이드는 앱의 생명주기에 해당하는 콜백 함수가 많이 사용되어, 각 콜백 함수의 호출 시기가 정해져 있지 않다.

- 때문에, UI요소를 사용 시 보통 lateinit를 사용해 객체를 선언하면 좋다.

package com.example.myapplication

import android.app.AlarmManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    private lateinit var myTextView: TextView    // 지연 초기화를 위한 선언

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myTextView = findViewById(R.id.myView) as TextView //지연 초기화 시점
    }
}

우선 activity_main에 Hello World란 textview가 생성되어 있을텐데, 클릭하여 id에 myView라고 저장하자

( 코드에서 R.id.myView 라고 매핑시켜주기 위해 지정해야 한다. )

- UI요소로 사용할 TextView를 lateinit로 선헌 후 오버라이딩 된 콜백 함수인 onCreate(0 내의 블록에서 findViewById로 리소스를 할당했다.

- as 키워드를 통해 TextView 형식으로 변환한다. (as 키워드는 코틀린 카테고리에 따로 포스팅 할 예정 )

 

lateinit는 시스템 서비스를 초기화시 사용할 수도 있다.

package com.example.myapplication

import android.app.AlarmManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView
import androidx.annotation.RequiresApi

class MainActivity : AppCompatActivity() {
    lateinit var alarmManager : AlarmManager
    @RequiresApi(Build.VERSION_CODES.M)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        alarmManager = getSystemService(AlarmManager::class.java)
    }
}

- alarmManager는 lateinit로 선언되어 앱의 생명주기 중 하나인 생성 단계의 콜백 함수 onCreate()에서 초기화할 수 있다.

- 만약 onCreate()가 진행되기 전 초기화를 하면 IllegalStateException 오류 발생

- getSystemService()를 사용하면 처음에 빨간 줄이 뜨는데 이건 API를 사용해야하기 때문이다.

- 안드로이드 프레임워크는 자바로 만들어져서 자바의 요소를 사용하려면 ::class.java를 붙여야 한다.

 

안드로이드 lazy를 통한 UI 요소 초기화

- by lazy {...}와 같이 람다식을 사용하는 위임 형식의 초기화는 안드로이드에서 유용하다.

- 뷰 요소가 서로 다른 생명주기에서 초기화 되어야 하는 경우를 보자

package com.example.myapplication

import android.app.AlarmManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    private val myView : TextView by lazy {
        findViewById(R.id.myView) as TextView
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun setHello(){
        myView.text = "Hello!!"
    }
}

- lazy 본문에서 UI를 위한 리소스 id인 myView를 찾아 초기화 하기 위해 findViewById를 사용했다.

- 이 블록은 해당 리소스에 처음 접근되는 시점에서 실행이된다.

- 즉, by lazy는 바로 실행되는 것이 아니라 myView 리소스에 접근할 때까지 기다린다.

- 화면이 초기화 되는 시점은 onCreate() 콜백 함수가 호출되고 setHello()함수가 실행되어 그 안에 값을 넣는 순간 실행된다.

반응형
Comments