intent: 실행할 작업을 나타내는 객체.
val intent = Intent(context, DetailActivity::class.java)
intent.putExtra(DetailActivity.LETTER, holder.button.text.toString())
context.startActivity(intent)
암시적 인텐트 호출 예
val queryUrl: Uri = Uri.parse("${DetailActivity.SEARCH_PREFIX}${item}")
val intent = Intent(Intent.ACTION_VIEW, queryUrl)
context.startActivity(intent)
모든 activity에는 lifecycle이 있다. 수명 주기는 처음 초기화될 때부터 마지막으로 소멸되어 시스템에서 메모리를 회수할 때까지 액티비티가 거쳐 갈 수 있는 여러 상태로 구성된다. onCreate()
메서드에서 액티비티의 일회성 초기화를 실행해야 한다. 예를 들어 onCreate()
에서 레이아웃을 확장하거나 클릭 리스너를 정의하거나 뷰 바인딩을 설정한다.
onCreate()
가 실행되면 액티비티가 생성된 것으로 간주한다.
onStart()
수명 주기 메서드는 onCreate()
직후에 호출된다. onStart()
가 실행되면 액티비티가 화면에 표시됩니다. 액티비티를 초기화하는 데 한 번만 호출되는 onCreate()
와 달리 onStart()
는 활동의 수명 주기에서 여러 번 호출될 수 있다.
onStart()
는 상응하는 onStop()
수명 주기 메서드와 페어링된다. 사용자가 앱을 시작한 후 기기 홈 화면으로 돌아오면 액티비티가 중지되고 더 이상 화면에 표시되지 않는다.
onResume()
은 액티비티 포커스를 제공하고 사용자가 상호작용할 수 있도록 액티비티를 준비한다.
onDestroy()
메서드의 실행은 액티비티가 완전히 종료되었음을 의미하며, 차지하고 있던 메모리도 정리된다.
코드에서 수동으로 액티비티의 finish()
메서드를 호출하거나 사용자가 앱을 강제 종료하는 경우에도 완전히 종료될 수 있다.
앱을 빌드하면 onCreate
, onStart
, onResume
이 차례대로 실행되고, 뒤로 버튼을 눌러서 앱을 종료할때는 onPause
, onStop
, onDestroy
가 차례로 실행된다. 다시 앱으로 돌아가면 안드로이드는 다시 onCreate
부터 실행한다.
만약에 뒤로 버튼 대신 홈 버튼을 눌렀다가 다시 앱으로 돌아온다면? onPause()
메서드와 onStop()
메서드만 호출되고 onDestroy()
는 호출되지 않는다.
Activity
객체는 여전히 백그라운드에서 메모리에 있고, 소멸되지 않았다. 사용자가 다시 돌아올 수 있으므로 안드로이드는 액티비티 리소스를 유지한다.
사용자가 앱으로 돌아오면 onRestart()
과 onStart()
,onResume()
이 차례로 실행된다.
이렇게 포그라운드-백그라운드를 왔다갔다하는걸 표시 수명 주기라고 한다.
onRestart()
메서드는 onCreate()
와 비슷하다. 둘 다 액티비티가 표시되기 전에 호출된다. 하지만 onCreate()
메서드는 맨 처음에만 호출되고 onRestart()
는 그 후에 호출된다.
이런경우에는?(공유 버튼을 눌러서 뜬 팝업으로 매인액티비티가 약간 가려짐) onPause()
만 실행된다. 액티비티가 계속 부분적으로 표시되기 때문에 onStop()
은 실행되지 않는다.
팝업창을 닫아 다시 액티비티로 돌아가면 onResume()
이 실행된다. onResume()
과 onPause()
는 모두 포커스와 관련이 있다. onResume()
메서드는 액티비티에 포커스가 있을 때 호출되고 onPause()
는 액티비티에 포커스가 없을 때 호출된다.
디저트 사진을 클릭할때마 아래 숫자가+1되고 금액이 조정되는 앱
...이 앱에는 치명적인 버그(?) 가 있는데 앱을 가로모드로 바꿨다가 다시 세로모드로 바꾸면 액티비티가 소멸됐다가 다시 생성되면서 클릭횟수가 0이 되어버린다. 번들 데이터를 이용해서 이 현상을 고쳐보자.
onSaveInstanceState()
메서드는 Activity
가 소멸되면 나중에 필요할 수 있는 데이터를 저장하는 데 사용하는 콜백이다. onSaveInstanceState()
는 액티비티가 중지된 후 호출되며, 백그라운드로 전환될 때마다 호출됩니다. (onStop
시 호출..)
const val KEY_REVENUE = "revenue_key"
const val KEY_DESSERT_SOLD = "dessert_sold_key"
...
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt(KEY_REVENUE, revenue)
outState.putInt(KEY_DESSERT_SOLD, dessertsSold)
Log.d(TAG, "onSaveInstanceState Called")
}
outState
매개변수는 Bundle
유형이다. Bundle
은 키-값 쌍 모음으로, 키는 항상 문자열이다.
액티비티 상태는 onCreate(Bundle)
이나 onRestoreInstanceState(Bundle)
에서 복원할 수 있다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//이전 클릭수/달러 기록이 있으면가져온다.
if (savedInstanceState != null) {
revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
}
...
이제 앱을 가로모드로 바꿨다가 돌아와도 클릭수가 잘 유지된다.