Study/Android (Kotlin)
[Android/Kotlin] Lifecycle 생명주기 / 메모장 만들기 1
this_is_mins
2023. 10. 9. 16:22
📌 Lifecycle (생명주기)란?
👉 안드로이드 시스템에서 앱이 실행되는 동안 상태 변화를 추적하고 관리하는 방법
👉 자원을 최적화하고 안정적인 사용자 경험을 제공!
📌 생명주기 구성
활동(Activity)
사용자 인터페이스(UI)를 제공하는 구성요소입니다. 액티비티는 앱에서 화면에 보이는 하나의 창. 액티비티는 onCreate(), onStart(), onResume()과 같은 여러 메서드를 가지고 있음.
서비스(Service)
백그라운드에서 실행되는 구성요소. 서비스는 활동이나 사용자 인터페이스를 제공하지 않는다. 대신에, 데이터를 검색하거나, 파일을 다운로드하거나, 음악을 재생하거나, 네트워크에 연결하는 등의 작업을 수행함.
브로드캐스트 수신자(Broadcast Receiver)
안드로이드 시스템이 보내는 브로드캐스트 메시지를 수신하는 구성요소. 브로드캐스트 수신자는 알람이 울리거나, 배터리가 부족해지거나, 네트워크 연결이 변경될 때 등 다양한 이벤트를 수신할 수 있음.
콘텐트 제공자(Content Provider)
앱 데이터를 관리하고 다른 앱이나 시스템에서 액세스할 수 있도록 제공하는 구성요소. 콘텐트 제공자를 사용하면 데이터베이스, 파일 시스템 또는 웹을 통해 데이터를 공유할 수 있음.
💡 Activity의 생명주기
- Running (실행 중): Activity가 화면에 나타나서 사용자와 상호작용할 수 있는 상태입니다. 이 상태에서는 Activity가 최상위에 위치하며, 사용자가 다른 Activity로 전환하거나, 홈 버튼을 누르거나, 뒤로 버튼을 누르는 등의 이벤트가 발생하면 일시적으로 다른 상태로 이동합니다.
- Paused (일시정지 중): Running 상태에서 일시적으로 다른 Activity가 화면을 가리거나, 사용자가 다른 앱으로 전환하는 등의 이벤트가 발생하면 이 상태로 전환됩니다. 이 상태에서는 Activity가 여전히 메모리에 남아있으며, 다시 Running 상태로 돌아올 수 있습니다.
- Stopped (정지 상태): Paused 상태에서 더 이상 사용자와 상호작용하지 않으면, 시스템에서 이 Activity를 정지시킵니다. 이 상태에서는 Activity가 화면에서 보이지 않지만, 메모리에는 남아있습니다.
- Destroyed (종료 상태): Activity가 종료되어서 메모리에서 완전히 제거된 상태입니다. 이 상태에서는 Activity가 더 이상 실행되지 않으며, 다시 생성할 때 onCreate() 메서드부터 호출됩니다.
- Created (생성된 상태): Activity가 생성되어 메모리에 로드된 상태입니다. 이 상태에서는 아직 UI가 생성되지 않았으며, onCreate() 메서드가 호출된 이후에 UI가 생성됩니다.
- Started (시작된 상태): Activity가 화면에 표시되기 시작한 상태입니다. onStart() 메서드가 호출된 이후에는 Activity가 사용자에게 보이기 시작하며, 화면에 나타나기 전에 필요한 작업을 수행할 수 있습니다.
- Resumed (재개된 상태): Activity가 최상위에 위치하고, 사용자와 상호작용할 수 있는 상태입니다. onResume() 메서드가 호출된 이후에는 Activity가 완전히 실행되었으며, 사용자와 상호작용할 준비가 된 상태입니다. 이 상태에서는 사용자 입력을 받을 수 있으며, 다른 이벤트를 처리할 수도 있습니다.
💡 Fragment의 생명주기
- Initialized (초기화 상태): Fragment 객체가 생성되고, 메모리에 로드된 상태입니다. 이 상태에서는 onCreateView() 메서드가 호출되기 전이며, Fragment가 UI를 가지고 있지 않습니다.
- Created (생성된 상태): onCreateView() 메서드가 호출되어 Fragment의 UI가 생성된 상태입니다. 이 상태에서는 Fragment가 사용자에게 표시되지 않았기 때문에, onPause() 메서드는 호출되지 않습니다.
- Started (시작된 상태): Fragment가 Activity에 연결되어서 화면에 표시될 준비가 된 상태입니다. onActivityCreated() 메서드가 호출된 후에 onStart() 메서드가 호출됩니다.
- Resumed (재개된 상태): Fragment가 사용자와 상호작용할 수 있는 최상위 상태입니다. onResume() 메서드가 호출된 후에 Fragment가 화면에 나타나며, 사용자와 상호작용할 준비가 됩니다.
- Paused (일시정지 상태): Fragment가 부분적으로 가려지거나, Activity가 다른 Fragment로 교체될 때 일시적으로 발생하는 상태입니다. 이 상태에서는 Fragment가 여전히 메모리에 남아있지만, 사용자와의 상호작용을 중지합니다.
- Stopped (정지된 상태): Fragment가 완전히 가려지거나, Activity가 정지될 때 발생하는 상태입니다. 이 상태에서는 Fragment가 화면에서 사라지며, onStop() 메서드가 호출됩니다. 이후에는 필요에 따라 onDestroyView()와 onDestroy() 메서드가 호출될 수 있습니다.
✅ Activity와 Fragment의 생명 주기 차이점
- 생명 주기 호출 위치: Activity의 생명 주기 콜백 메서드는 Activity 클래스에서 직접 호출됩니다. 반면에 Fragment의 생명 주기 콜백 메서드는 Fragment 클래스에서 직접 호출되지 않고, Fragment가 속한 Activity의 생명 주기 콜백 메서드 내부에서 호출됩니다.
- Fragment의 라이프사이클 관리: Fragment는 Activity 내에서 라이프사이클 관리를 위해 FragmentManager와 함께 사용됩니다. FragmentManager는 Fragment의 생명 주기를 자동으로 관리하고, 필요에 따라 Fragment 인스턴스를 생성하거나 삭제합니다.
- 재사용 가능성: Fragment는 Activity 내에서 여러 번 재사용될 수 있습니다. 이것은 프래그먼트가 작은 화면 요소로 사용되어 Activity 내에서 다른 프래그먼트와 함께 표시되는 경우 더욱 중요합니다. 반면, Activity는 일반적으로 하나의 UI 요소를 표시하므로, 단일 인스턴스만 존재하며 재사용되지 않습니다.
- 백스택 관리: Activity는 백스택에서 관리되는 독립적인 엔티티이며, 일반적으로 다른 Activity와 함께 작동합니다. 반면, Fragment는 Activity의 일부분으로 존재하며, Activity의 라이프사이클에 밀접하게 연관됩니다. 따라서 백스택 관리 방식도 Activity와 Fragment에서 차이가 있습니다.
- onActivityResult() 호출: Activity에서는 startActivityForResult() 메서드를 사용하여 Activity 간에 데이터를 전달하고 수신할 수 있습니다. 이 경우, onActivityResult() 메서드가 호출되어 결과를 처리합니다. 반면에 Fragment에서는 onActivityResult() 메서드가 직접 호출되지 않습니다.
💡메모장 만들기
⚠️ viewBinding 적용하기!
1. 화면 / 확인 화면 구성
- 메모를 작성할 화면(activity_main.xml)
- EditText와 Button 배치
<TextView
android:id="@+id/MemoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="16dp"
android:text="MEMO"
android:textSize="40dp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/memo"
android:layout_width="373dp"
android:layout_height="580dp"
android:gravity="top"
android:hint="내용을 입력해주세요"
android:textColorHint="#747474"
app:layout_constraintLeft_toLeftOf="@id/MemoTitle"
app:layout_constraintTop_toBottomOf="@id/MemoTitle" />
<Button
android:id="@+id/saveBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="160dp"
android:layout_marginBottom="20dp"
android:background="@drawable/roundbox"
android:text="저장"
android:textStyle="bold"
android:drawableRight="@drawable/ic_baseline_save_alt_24"
android:textColor="#4374D9"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent" />
- 메모를 확인할 화면(activity_second.xml)
- 전닯받은 내용 보여줄 TextView배치
<TextView
android:id="@+id/MemoTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginTop="16dp"
android:text="MEMO"
android:textSize="40dp"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/hello"
android:layout_width="365dp"
android:layout_height="610dp"
android:text="000"
android:textColor="@color/black"
android:textSize="30dp"
app:layout_constraintLeft_toLeftOf="@id/MemoTitle"
app:layout_constraintTop_toBottomOf="@id/MemoTitle"/>
2. 생명주기 구현
MainActivity
1️⃣ onCreate()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding=ActivityMainBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
Log.d("Lifecylce","onCreate")
viewBinding.saveBtn.setOnClickListener{
var resultText=viewBinding.memo.text.toString()
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("text",resultText)
startActivity(intent)
}
val create=Toast.makeText(this.applicationContext,"onCreate",Toast.LENGTH_SHORT)
create.show()
}
- viewBinding 사용하기
- setOnClickListener 로 버튼 클릭 시 내용을 넘겨주는 코드 작성
2️⃣ onStop()
override fun onStop() {
super.onStop()
content=viewBinding.memo.text.toString()
viewBinding.memo.text.clear()
Log.d("Lifecycle","onStop")
}
- EditText로 받은 내용을 저장해 놓을 전역 변수 content선언
- content에 내용 저장 후 EditText는 clear 시킴
2️⃣ onRestart()
override fun onRestart() {
super.onRestart()
AlertDialog.Builder(this).setTitle("Wait!").setMessage("이어서 작성하시겠습니까?")
.setPositiveButton("예") {
dialog, which->viewBinding.memo.setText(content)
}
.setNegativeButton("아니요"){
dialog,which->viewBinding.memo.clearAnimation()
}
.create()
.show()
Log.d("Lifecycle","onRestart")
}
- AlertDialog를 이용해 이어서 작성할 것인지 물어보는 창 만들기
setTitle 제목 설정
setMessage | 내용 입력 |
setIcon | 아이콘 설정 |
setPositiveButton | “ok” 버튼 |
setNegativeButton | “cancel” 버튼 |
setItem | 목록 출력 |
setSingleChoiceItems | 라디오 버튼 목록 |
setMultiChoiceItems | 체크박스 목록 |
SecondActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewBinding=ActivitySecondBinding.inflate(layoutInflater)
setContentView(viewBinding.root)
val extras=intent.extras
val data =extras!!["text"] as String
viewBinding.hello.text=data
Log.d("Lifecylce2","onCreate")
}
- MainActivity에서 전달 받은 내용 보여주기