본문 바로가기

[Android]/궁금해요!

Dialog 관련 Activity 생명주기

안녕하세요!

 

오랜만에 글 남깁니다.

이런 질문을 보았습니다.

 

Dialog를 화면에 띄울 때 Dialog를 띄우는 Activity의 onPause()가 호출되는가?

그리고 권한 요청 다이얼로그를 화면에 띄울 때는 onPause()가 호출되는가?

 

참고로 권한 요청 다이얼로그라고 하면 아래 그림과 같으며 많이 봐보셨을 겁니다.

Dangerous Permission을 부여해야 할 때 런타임에서 권한 체크를 하는 것입니다.

Dangerous Permission 중 하나인 READ_CONTACTS을 요청하는 상황

Permission (Normal, Dangerous) 관련해서는 아래 리스트 참조

https://stackoverflow.com/questions/36936914/list-of-android-permissions-normal-permissions-and-dangerous-permissions-in-api

 

 

저도 궁금해서 테스트를 해보았습니다.

 

1) 먼저 Custom Dialog 클래스를 만들었습니다.

2) Activity에서 아래와 같이 onPause() 시 Toast를 띄우도록 하였습니다.

 

[결과]

Dialog를 Show() 하는 경우, 해당 Activity의 onPause는 호출되지 않았습니다.

 

반대로 Permission Dialog가 띄워질 때는 onPause가 호출되었습니다.

 

 

[분석]

다이얼로그를 띄울 시 onPause가 호출되지 않는 이유

-> 다이얼로그는 Activity가 아니기 때문에 Activity Stack에 쌓이지 않습니다. 그렇기 때문에 다이얼로그가 띄워진다고 현재 Activity를 정지시키지 않습니다.

참조: stackoverflow.com/a/7384782/4527638

 

그럼 권한 요청 다이얼로그도 "다이얼로그"인데 왜 onPause가 호출되는가?

-> 권한을 요청 시 requestPermissions() 메소드를 호출해야 합니다. 안드로이드 디벨로퍼 문서에 의하면, 앱이 요구하는 권한을 허용하고 있지 않은 경우 권한 요청을 하는 UI를 띄운다고 되어있습니다. 즉 다이얼로그라고 명시하지 않았지만, 저희 눈에는 다이얼로그로 보이기 때문에 권한 요청 다이얼로그라고 불리는 것이 아닐까 싶습니다. 더불어 이 메소드(requestPermission)는 사용자에게 어떠한 권한을 허용하고 거절할지에 대한 Activity를 띄울 수 있다고 나와있습니다. 그렇기 때문에 개발자는 현재 Activity가 pause 되고 resume 될 수 있다는 것을 알고 준비해야 한다고 나와있습니다. (아래 문서에서 발췌한 부분(영어) 참조)

 

If your app does not have the requested permissions the user will be presented with UI for accepting them. After the user has accepted or rejected the requested permissions you will receive a callback reporting whether the permissions were granted or not. Your activity has to implement ActivityCompat.OnRequestPermissionsResultCallback and the results of permission requests will be delivered to its onRequestPermissionsResult(int, String[], int[]) method.

 

This method may start an activity allowing the user to choose which permissions to grant and which to reject. Hence, you should be prepared that your activity may be paused and resumed. Further, granting some permissions may require a restart of you application. In such a case, the system will recreate the activity stack before delivering the result to your onRequestPermissionsResult(int, String[], int[]).

 

출처: https://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#requestPermissions(android.app.Activity,%20java.lang.String[],%20int)

 

 

즉 권한 요청 UI는 다이얼로그로 보이지만 따지고 보면 일반 Dialog와 동작 방식이 다르다는 것! 

혹시 누가? 아니면 어떠한 면접관께서 "다이얼로그 호출 시 onPause가 호출되는가? 만약 호출되지 않으면 권한 요청 다이얼로그는 onPause가 호출되는가?"라고 물어본다면 잘 대답하시기 바랍니다.

--> 일반적인 다이얼로그를 띄울 시 onPause가 호출되지 않습니다. 그 이유로는 일반적인 다이얼로그는 Activity가 아니기 때문에 Activity 스택에 쌓이지 않으며 현재 Activity를 일시정지시킬 이유가 없습니다. 반대로 권한 요청 다이얼로그는 다이얼로그처럼 보이는 UI일 뿐 실제 동작은 권한을 허용할 것인지 거절할 것인지에 대한 UI를 띄우며 Activity를 띄울 수 있습니다. 그렇기 때문에 현재 Activity에서 onPause가 호출되는 것이며, Activity로 실행이 되어야 onRequestPermissionResult 오버라이드 함수가 호출되어 권한이 허용되었는지 거절되었는지에 대한 결과 값을 받아 올 수 있습니다. 만약에 일반적인 Dialog였다면 interface를 구현해서 결괏값을 받아와야 하지 않았을까 싶습니다. (마지막 줄은 TMI... ㅋㅋ)

 

<참고로 Head up notification 또한 onPause를 호출시키지 않습니다. 그러나 Dialog Theme으로 구현된 Activity는 액티비티를 상속받으므로 현재 액티비티 스택에 쌓이므로 현재 Activity의 onPause를 호출시키게 됩니다.>

 

이번 궁금해요와 관련된 코드는 아래 Github를 확인해보시기 바랍니다.

https://github.com/DJDrama/DialogLifecycleTest

 

DJDrama/DialogLifecycleTest

Contribute to DJDrama/DialogLifecycleTest development by creating an account on GitHub.

github.com

 

혹시 궁금한 사항이 있는데 내가 하기는 귀찮다 싶은 질문이 있으면 댓글로 남겨주시기 바랍니다.

더불어 제가 잘못 작성하거나 잘못 알고 있는 부분이 있으면 댓글에 과감히 지적해주시면 감사하겠습니다.