[생명주기] 액티비티 간 생명주기

panax·2021년 12월 19일
0

Android

목록 보기
6/16

액티비티 생명주기

안드로이드 개발을 하는 사람이라면, 액티비티 생명주기에 대해서 알고 있을 것이다.

안드로이드에서 생명주기는 프래그먼트, 서비스, 브로드캐스트 등에도 존재하지만 가장 많이 사용되는 액티비티 생명주기에서 알아야 할 점이 있어 글을 작성했다.

액티비티 생명주기는 위와 같은 구조를 이루고 있으며, 안드로이드 개발을 하는 사람이라면 대부분 알고 있을 것이다.

하지만 해당 그림은 하나의 액티비티에 대한 생명주기를 나타낸 그림으로 2개 이상의 액티비티를 사용한다면, 다른 결과를 보여준다.

액티비티 간 생명주기

하나의 액티비티에서 다른 액티비티를 실행할 때 발생하는 생명주기를 알기 위해 다음 코드를 사용했다.

먼저 앱이 시작하면 나타나는 첫 번째 액티비티 코드이다.

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

        findViewById<Button>(R.id.button).setOnClickListener {
            val intent = Intent(this, MainActivity2::class.java)
            startActivity(intent)
        }
        Log.d("1", "onCreate()")
    }

    override fun onStart() {
        super.onStart()
        Log.d("1", "onStart()")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("1", "onRestart()")
    }

    override fun onResume() {
        super.onResume()
        Log.d("1", "onResume()")
    }

    override fun onPause() {
        super.onPause()
        Log.d("1", "onPause()")
    }

    override fun onStop() {
        super.onStop()
        Log.d("1", "onStop()")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("1", "onDestroy()")
    }
}

다음으로 첫 번째 액티비티에서 이동할 두 번째 액티비티이다.

class MainActivity2 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main2)

        Log.d("2", "onCreate()")
    }

    override fun onStart() {
        super.onStart()
        Log.d("2", "onStart()")
    }

    override fun onRestart() {
        super.onRestart()
        Log.d("2", "onRestart()")
    }

    override fun onResume() {
        super.onResume()
        Log.d("2", "onResume()")
    }

    override fun onPause() {
        super.onPause()
        Log.d("2", "onPause()")
    }

    override fun onStop() {
        super.onStop()
        Log.d("2", "onStop()")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("2", "onDestroy()")
    }
}

결과

액티비티 생명주기 그림을 본 사람이라면, 첫 번째 액티비티의 onDestroy() 가 호출된 뒤에 두 번째 액티비티의 onCreate() 가 호출될 거라 예상할 수 있다.

하지만 실제 결과는 다음과 같다.
D/1 은 첫 번째 액티비티, D/2 는 두 번째 액티비티의 로그이다.


첫 번째 액티비티에서 두 번째 액티비티를 호출하면 첫 번째 액티비티의 onPause() 다음에 두 번째 액티비티가 생성되는 것을 볼 수 있다. 처음에 예상한 onDestroy() 는 호출되지 않은 것을 볼 수 있다.


다음으로는 두 번째 액티비티에서 백 버튼을 눌러 첫 번째 액티비티로 되돌아가는 경우의 로그이다.
onPause() 를 호출하는 건 동일하지만 이번에는 onCreate() 대신 onRestart() 가 호출되고 두 번째 액티비티가 onDestroy()로 삭제되는 것을 볼 수 있다.

공식 문서

개발자 문서

결론

안드로이드에서 어떤 자원을 사용할 때 하나의 액티비티 안에서만 사용하는 것이 일반적이다.

하지만 하나의 자원을 다른 액티비티에서도 사용해야 한다면, 생명 주기를 염두에 두고 설계를 해야할 필요가 있다.

profile
안드로이드 개발자

0개의 댓글