예전에 어딘가에서 본 재미있는 사진을 실현시켜봤다. 폰 화면을 켜면 폰을 몇 초 동안 쓰지 않고 있었는지 알려주는 앱이다.
https://play.google.com/store/apps/details?id=nna.ca.ha.focusec
몇초집중함 - Google Play 앱
이 앱은 당신이 폰을 몇 초 동안 사용하지 않았는지 알려줍니다. ---- 개발자 연락처 : dtmdgus901@gmail.com
play.google.com
안드로이드 7.0부터 service, receiver등을 사용하는 데에 제약이 생겼고. 8.0에서는 그 제약이 더 강화되었다.
그래서 앱 개발이 쉽지많은 않았는데. 이 앱을 개발함으로써 foreground service, background service, broadcast receiver에 대해 탄탄하게 알게 되었고 다시 정리하는 시간을 가지게 되었다. (추후 관련 글을 쓸 예정)
이 앱은 먼저 사용자가 폰 화면을 키면 몇 초동안 폰을 사용하지 않고 있었는지 알려주는 앱이기 때문에 사용자가 폰 화면을 껐는지 켰는지에 관해 알아야 한다. 그러기 위해서는 broadcast receiver를 사용해야 된다. broadcast란 말 그대로 방송. 안드로이드의 상태를 다른 앱에 알려주는 거라고 생각하면 쉽다. receiver을 이용해 들어오는 broadcast를 받을 수 있다. 그래서 이 앱에서는 SCREEN_OFF, SCREEN_ON 액션을 받는다.
그렇지만. 이렇게 브로드캐스트 리시버를 설정해놓는다고 백그라운드에서 브로드캐스트를 받을수는 없다.
Android 7.0부터는 브로드캐스트 리시버가 너무 시스템 자원을 낭비한다고 리시버에 제약을 걸었다.
앱에서 리시버를 등록하면, 그 리시버는 앱이 살아있을동안만 브로드캐스트를 받는다.
그러므로 백그라운드에서 리시버를 받기 위해 포그라운드 서비스를 해야만 한다.
foreground란 쉽게 말해 앱과 상호작용이 가능한 상태이고, background는 앱 사용 시 홈버튼을 누르거나 해서 앱 밖으로 나갔을 때를 말한다고 보면 된다. 그렇지만. Android의 제약이 강화되면서 foreground service를 실행하려면 무조건 지워지지 않는 notification을 띄워야만 한다. startForegroundService()를 통해 foreground 서비스가 시작되고 나서 5초 안에 notification을 앱에서 띄우지 않으면 Android에서 foreground service를 죽인다.
그러므로 위 앱을 개발할때는 앱을 시작하자마자 startForegroundService() 하고 포그라운드 notification을 띄운 뒤, 포그라운드 서비스에서 스크린 broadcast를 받는 receiver를 등록해 앱을 꺼놓은 상태여도 화면 상태를 받아올 수 있게 하였다.
receiver에서는 폰 화면 꺼짐 동작을 받으면 현재 시간을 저장하고. (date.getTime())
SharedPreference에 저장한다.
그리고, 폰을 화면 켜짐 동작을 받으면 SharedPreference에 저장된 시간과 현재 date.getTime()을 빼서 차를 구해 폰을 몇 초 만에 켰는지 계산하고, 초를 60으로 나눈 뒤 1이 넘으면 다시 그 값을 60으로 나누고, 또 1이 넘으면 다시 60으로 나눠서 시, 분, 초를 구한 뒤 Toast를 띄운다.
Android의 서비스에 관해 잘 알게 되었다.
'일일 스터디노트' 카테고리의 다른 글
사서 고생하기 | 38일차 | 꿈 알람 버그 수정 (0) | 2019.12.25 |
---|---|
사서 고생하기 | 37일차 | Tilt to read Generator 개발 (2) | 2019.12.21 |
사서 고생하기 | 35일차 | 꿈 생각 알람 추가 (0) | 2019.12.14 |
사서 고생하기 | 34일차 | 꿈일기 바 추가 (0) | 2019.12.07 |
사서 고생하기 | 33일차 | HOW TO 방침 추가 (0) | 2019.12.05 |