-
잠금화면을 만드는 과정프로젝트/영어단어 잠금화면 2021. 12. 7. 16:09
영어단어 잠금화면의 핵심 기능인 잠금화면을 만드는 과정을 서술한다.
구현할 기능은 다음과 같다.
1. 잠금화면은 퀴즈를 통해서 잠금 해제할 수 있다.
2. 퀴즈는 랜덤한 UI로 2~3개를 우선적으로 구현할 것이다.
3. 퀴즈를 풀지 않아도 넘어갈 수 있는 즉시 잠금해제 버튼을 넣고, 그 버튼은 총 5번 누를 수 있게 한다.
4. 제한 한도가 끝나면 그 버튼을 비활성화하고, 0시 정각에 그 횟수를 초기화한다.
-----------------------------------------------------------------------------------------------------------------------------------
2021-12-07
잠금화면을 개발하는 기초 상식은
[Android] 잠금화면 액티비티 설정 (tistory.com)
이 곳과
android Oreo 이상 앱 종료시점 (tistory.com)
이곳을 참고하여 작성하고 있다.
가장 고민중인 것은 UI 설정, 제한 한도 관리 이 2가지이다.
Service에서는 단순히 잠금화면이 켜지는 서비스만을 제공하기 때문에 이런 한도나 UI 설정에서 이를 건드릴 수는 없고,
그렇다면 Activity에서 이를 관리해줘야하는데, 가장 고민인건 UI에 관한 설정이다.
SCREEN_ON -> Fragment 선택 -> DB로부터 단어 랜덤 추출 -> 세팅
거기다 퀴즈이기 때문에 답을 선택하는 과정까지 선보여야하는데 과연 이게
화면을 지속적으로 키고 끄는 상황에서 제대로 동작을 할 수 있을지부터가 의문이 든다.
2021-12-16
잠금화면이 동작하지 않는 것을 해결하였다.
기존에는 onStartCommand에서 register를 동작하는 방식을 취했는데, 이를 onCreate로 전부 옮겨서
notification에 대해서 등록 후 바로 알림을 멈춰주는 방식을 통해 불필요한 알림을 제외시켰고,
그 뒤 register를 등록하고, Activity에서는 일단 finish()를 통해 Activity를 종료하는 버튼을 하나 만들어서 여러 테스트를 해봤다.
일단 확실히 '다른 앱 위에 표시' 권한이 허용된 상태에서 잠금화면은 패턴 혹은 지문을 등록하기 전에 Activity를 올려
내가 의도한 방향대로 구현이 잘 된 것 같았다. 허나, 패턴을 이용해서 풀려고 하는 경우 Activity에서 동작을 실행하기 전에 패턴을 입력하라는 화면이 나오는 것을 해결해야할 것 같다.
만약 사용자의 기기에서 자체적인 잠금 방식이 있게 되면, 이를 후순위로 밀고, 이 Activity가 종료되어야만 원래 잠금을 해제할 수 있는 방향으로 가려고 하지만, 이렇게 되면 이중 잠금을 푸는 것이기 때문에 사용자 입장에서는 번거로울 수 있다. 더 간단한 방법은 모든 잠금방식을 무시하고, 내 잠금화면에서 Activity가 성공적으로 종료되면 잠금이 전체 풀리는 것인데, 이것은 아마 구현이 안될 것으로 생각된다. 일단 전자의 방향성에서 시간이 지나면 패턴을 해제하라는 화면을 없애보는 것이 1순위일 듯 하다.
2021-12-19
사용을 해보던 도중 여러 문제가 있었고, 그 문제를 해결한 방법에 대해서 나열해보고자 한다.
또한, 해결되지 않은 것이 하나 있는데, 이것 또한 다뤄보려고 한다.
일단 onCreate, onStartCommand에 대해서는 무지한 부분이었다.
stopForeground는 notification을 정지하는게 아니라, Foreground Service가 stop하는 코드였고, 그 인자로써
상태 표시줄 역시 없앨 것인지 판단하는 것이었다. 그래서, 이 코드를 없애고 나니 그 뒤로 코드가 꺼지는 일은 없었다.
그래서 실제 Activity에서 실행이 될 때 register를 ACTION_SCREEN_OFF flag를 지닌 receiver를 등록하고, onCreate에서는 최초 알림을 만들어내는 역할을 부여했다. 그런데, 사실 내 서비스는 상태 표시줄에 뜨지 않게끔 설정을 해뒀는데,
최초 실행 시 알림이 뜨면서 실행 중이라는 상태를 계속 표시했고, 이를 좀 더 알아봐서 아예 뜨지 않는 방향으로 고쳐보고자 한다. 일단 임시방편으로 현재 테스트중인 기기에서는 알림을 자체적으로 꺼버렸다.
또한 보통, 잠금화면을 제작할 때, setTurnScreenOn 함수와 requestDismissKeyguard, setShowWhenLocked 세 함수를 같이 사용하는 것으로 공부했었는데, 참고 블로그에서는 setTurnScreenOn 함수를 사용하지 않아서 의아해했었는데, 직접 사용해보니 화면을 자동으로 키는 상황이 발생해서, 이에 대해서 왜 이렇게 되는 것인지에 대한 공부를 하고 있다.
아마 이를 사용하지 않는 건 BroadCastReceiver에서 Action_screen_off 상태일 때 이미 activity를 실행하고 있고, 이 방법이 아마 setTurnScreenOn의 대체 방식이 아닐까하는 생각이 든다. 자세한 동작방식을 보면서 깨우쳐야 할 것 같다.
또, 잠금화면을 FullScreen으로 만드는 과정에서 R부터는 WindowInsetsController를 활용해 FullScreen과 navigation bar를 없애면 된다. 여기서 특정 동작을 할 때 navigation bar가 올라오는 (하단에서 위로 swipe하는 것과 같은...) 상황에 대해서 이를 차단하는 방법을 우선적으로 알아보려고 한다.
'프로젝트 > 영어단어 잠금화면' 카테고리의 다른 글
Android Package (0) 2022.12.09 Dialog 오류에 대한 해결 (1) 2021.12.02 Room Column 전체 삭제에 대한 고찰 (0) 2021.12.02