[Kotlin] LifeCycle 정리

ddwwon·2022년 11월 3일
0

Android

목록 보기
7/8
post-thumbnail

Activity LifeCycle

onCreate

Activity의 전체 수명 주기 동안 한 번만 발생해야 하는 기본 application 로직을 실행한다.

  • data를 list에 binding
  • activity를 ViewModel과 연결
  • 일부 클래스 범위의 변수를 인스턴스화

onStart

Acitivity가 사용자에게 표시된다. 앱이 Activity를 Foreground로 보내 상호작용할 수 있도록 준비해준다.

  • 메서드에서 앱이 UI를 관리하는 코드를 초기화한다.

onResume

앱이 사용자와 상호작용한다. 어떤 이벤트가 발생해 앱에서 포커스가 떠날 때까지 앱이 머무를 수 있다.

  • 전화가 올 때, 사용자가 다른 Activity로 이동할 때, 기기 화면이 꺼질 때

onPause

Activity가 일시중지되어 있는 상태일 때, 계속 실행되면 안되지만 잠시 후 다시 시작할 작업을 일시중지하거나 조정한다.

  • 시스템 리소스, 센서 핸들(GPS) or Activity가 일시 중지 중
  • 사용자가 필요로 하지 않을 때, 모든 리소스를 해제할 수 있다.

onStop

시스템에 Activity의 실행이 완료되어 종료될 시점에 사용한다.

  • 앱이 애니메이션을 일시중지할 때

onRestart

Activity가 다시 시작될 때 사용한다.

  • 특정 화면에서 뒤로 가기 등을 해서 Activity를 다시 시작할 때

onDestroy

Activity가 소멸된다.

  • 사용자가 활동을 완전히 닫을 때
  • finish()가 호출될 때
  • 구성 변경(ex: 기기 회전, 멀티 윈도우 모드)로 시스템이 일시적으로 Activity를 소멸시키는 경우

Fragment LifeCycle

onAttach

Fragment가 Activity에 붙을 때 호출된다. Fragment가 완벽하게 생성되진 않는다.

onCreate

Fragment가 처음 생성될 때 호출되며, 리소스를 초기화할 수 있다.

onCreateView

Layout을 Inflate하는 곳, Fragment가 자신의 Interface를 그리기 위해 호출한다.

onViewCreated

onCreateView()에서 반환된 View객체는 onViewCreated() 파라미터로 전달된다.

  • View의 초기값 설정, LiveData 옵저빙, RecyclerView or ViewPager에 사용될 Adapter 세팅

onStart

Fragment가 사용자에게 보여질 수 있을 때 호출된다.

  • FragementTransaction

onResume

Fragment가 보이는 상태에서 모든 Animator와 Transition 효과가 종료되고, Fragment가 사용자와 상호작용 할 수 있을 때 호출된다.

onPause

UI 관련 처리 장치와 중요한 데이터를 저장한다.

onStop

Fragment가 가려져서 화면에 보이지 않는 경우 호출된다.

onDestroyView

Activity에서 Fragment 생성 시 addToBackStack()을 요청했을 경우, onDestroy()를 호출하지 않고, 인스턴스가 저장되어 있다가 Fragment를 다시 부를 때 onCreateView()를 실행해 다시 화면에 보이게 한다.

onDestroy

view가 제거된 후 Fragment가 완전히 소멸되기 전에 호출된다.


간단한 메모 앱

메모 화면, 메모 확인 화면

SendMassageActivity.kt

  • ViewBinding
sendBinding = ActivitySendMessageBinding.inflate(layoutInflater)
  • Dialog Builder 생성
builder = AlertDialog.Builder(this)
  • EditText 내용 저장
messageContent = sendBinding.messageInput.text.toString()
  • 보내기 버튼 클릭 시, 다음 화면으로 이동
sendBinding.sentMessage.setOnClickListener {
            messageContent = sendBinding.messageInput.text.toString()
            val receivedMessageIntent = Intent(this, ReceivedMessageActivity::class.java)
            receivedMessageIntent.putExtra("message", messageContent)
            startActivity(receivedMessageIntent)
        }
  • Dialog 생성
        builder.setTitle("알림창")
        builder.setMessage("다시 작성하시겠습니까?")

        var listener = object : DialogInterface.OnClickListener {
            override fun onClick(dialog: DialogInterface?, index: Int) {
                when (index) {
                    // Dilog에서 아니오 버튼 클릭 시, EditText 초기화
                    DialogInterface.BUTTON_NEGATIVE -> {
                        messageContent = " "
                        sendBinding.messageInput.setText(messageContent)
                    }
                }
            }
        }
		builder.setPositiveButton("예", listener)
        builder.setNegativeButton("아니오", listener)
  • onPause 현재까지 작성한 내용 Activity의 전역변수에 담아두기
    override fun onPause() {
        super.onPause()
        messageContent = sendBinding.messageInput.text.toString()
    }
  • onResume onPause에서 저장한 전역변수 내용으로 EditText 내용으로 설정하기
    override fun onResume() {
        super.onResume()
        if (messageContent != " ") {
            sendBinding.messageInput.setText(messageContent)
        }
    }
  • onRestart Dialog를 활용하여 다시 작성할거냐고 묻는 창 띄우기, 다시 작성하지 않겠다고 하면 onPause에서 저장했던 변수 비우기
    override fun onRestart() {
        super.onRestart()
        builder.show()
    }
  • 전체 코드
package com.example.intentpractice

import android.content.DialogInterface
import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import com.example.intentpractice.databinding.ActivitySendMessageBinding


class SendMessageActivity : AppCompatActivity() {

    // 전연 변수 선언
    lateinit var sendBinding : ActivitySendMessageBinding
    lateinit var builder : AlertDialog.Builder
    lateinit var messageContent : String


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // ViewBinding 사용
        sendBinding = ActivitySendMessageBinding.inflate(layoutInflater)
        setContentView(sendBinding.root)

        // Dialog Builder 생성
        builder = AlertDialog.Builder(this)
        
        // EditText 내용을 저장하는 messageContent 선언
        messageContent = sendBinding.messageInput.text.toString()

        // 확인 버튼 클릭 시, 다음 화면으로 이동
        sendBinding.sentMessage.setOnClickListener {
            messageContent = sendBinding.messageInput.text.toString()
            val receivedMessageIntent = Intent(this, ReceivedMessageActivity::class.java)
            receivedMessageIntent.putExtra("message", messageContent)
            startActivity(receivedMessageIntent)
        }

        // Dialog 생성
        builder.setTitle("알림창")
        builder.setMessage("다시 작성하시겠습니까?")

        var listener = object : DialogInterface.OnClickListener {
            override fun onClick(dialog: DialogInterface?, index: Int) {
                when (index) {
                    // Dilog에서 아니오 버튼 클릭 시, EditText 초기화
                    DialogInterface.BUTTON_NEGATIVE -> {
                        messageContent = " "
                        sendBinding.messageInput.setText(messageContent)
                    }
                }
            }
        }

        builder.setPositiveButton("예", listener)
        builder.setNegativeButton("아니오", listener)
    }

    override fun onPause() {
        super.onPause()
        messageContent = sendBinding.messageInput.text.toString()
    }

    override fun onResume() {
        super.onResume()
        if (messageContent != " ") {
            sendBinding.messageInput.setText(messageContent)
        }
    }

    // 화면이 재시작 됐을 때, Dialog 띄우기
    override fun onRestart() {
        super.onRestart()
        builder.show()
    }
}

0개의 댓글