본문 바로가기
개발 관련 공부/코틀린

Unit 3-1(2)

by 슴새 2022. 9. 14.
반응형
이 포스트는 2021.12~2022.09 기간동안 벨로그에 작성한 글을 티스토리에 옮겨 적은 것입니다.

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)

Lifecycle

모든 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()를 사용한 번들 데이터 저장 및 복원

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)
             
        }
      ...

이제 앱을 가로모드로 바꿨다가 돌아와도 클릭수가 잘 유지된다.

 
반응형

'개발 관련 공부 > 코틀린' 카테고리의 다른 글

코틀린에서 ?와 !!  (0) 2022.09.14
Unit 3-1(2)  (0) 2022.09.14
Unit3-1(1)  (0) 2022.09.13
Unit2-3  (1) 2022.09.13
Unit2-2  (0) 2022.09.13

댓글