티스토리 뷰

이 블로그의 안드로이드 카테고리를 만든건 아마 2011년? 

안드로이드에 대한 것을 정리하면서, 나도 덩달아 더 공부를 하길 바라면서 만들었는데...쩝. 


이제라도 첫 삽을 뜨게 됐으니 꾸준하기를 바라며...



안드로이드에 잠금 기능이 있지만 일부 앱들은 자체적인 잠금화면을 따로 구현한다. 이 글에서는 이를 구현하는 방법에 대하서 얘기해보려고 한다. 



카카오톡 잠금화면

<카카오톡 잠금화면. 카톡이 유명하니까 예로 들었다>


그냥 숫자 네자리 입력받고 비교만 하면 되는 이 기능이 안드로이드의 라이프사이클과 사용자의 사용성을 모두 고려하면 은근히 구현하기에 까다로운 기능이 되어 뜨지 말아야 할 경우에 뜨거나 떠야할 상황에 안뜨는 일들이 발생한다. (예를들어 글을 쓰는 시점의 최신버전 카카오톡 4.8.0에서는 잠금 화면을 활성화 한 후 친구찾기 -> QR코드로 갔다가 back을 눌러 돌아오면 잠금 화면이 뜬다. )


개발하기 편하면서도 사용자의 편의성을 만족하는 것이 어려운 것 같다. 아무튼 구현 방법을 생각해보면, onCreate, onResume, onPause 등에서 체크를 하고 이에 맞는 동작을 해야하는데, 앱에서 구현하는 모든 Activity가 다 특정 Activity를 상속받아야 하는데 경우에 따라서 이 또한 귀찮은 일이다. 따라서 이 글에선 4.0 이상에서 추가된 Application.registerActivityLifecycleCallbacks을 통해 이를 구현한다. 


먼저 잠금화면이 뜨는 경우는 모든 Activity가 pause된 경우로 생각할 수 있다. 그런데 앱에서 외부 카메라를 사용하는 경우나 앱을 보고 있는 동안에 다른 앱이 푸시를 받아 다이얼로그를 띄우는 경우에도 우리 앱은 onPuase가 되어버리니 잠금화면이 뜬다. 이를 기획적으로 넘어갈 수 있다면 그냥 onResume과 onPause의 호출 횟수만 카운팅하여 구현할 수 있다. 


모노믹에서는 조금 다른 방법으로 구현으르 했는데, 

onPause에서 시간을 기록하고, onResume에왔을 때 시간을 비교하여 1분이 넘은 경우에 잠금 화면이 뜨도록 했다. 이렇게 구현하면 앱에서 잠깐씩 다른 앱으로 이동하는 경우에 잠금 화면이 안뜨는 경우도 있고 뜨는 경우도 있어서 일관성은 떨어지지만 대부분의 경우에는 사용하기 편하면서 잠금화면이 떠야하는 경우에도 별 문제가 없을 것 같았다. 

그리고 여기에 약간 살을 붙였는데, back으로 모든 activity가 finish된 경우엔 재실행시 1분이 지나지 않았어도 잠금 화면이 뜨는게 더 타당해 보여서, onDestory에서 activity.isTaskRoot()인 경우엔 시간을 초기화하여 다음 실행시 잠금 화면이 뜨도록 했다.


끝. 

 

그런데...카톡은 앱 내부에서의 이동인데 잠금화면 뜬 것을 보면 기본 구조가 이런 방식이 아닌듯? 궁금하다...







댓글
댓글쓰기 폼