오늘도 디버깅의 늪...
해결한 문제
1. enterPiPMode()
-> pip 지원을 충분히 검증하지만, 그래도 런타임 에러가 발생하는 기기가 있기에, runCatching으로 감싸주었다.
2. navController.navigate()
-> 이동할 목적지는 분명하더라도, 현재 fragment가 어디있는지를 확신할 수 없다면 인자로 어떤 값을 줘야할지 애매하다.
그래서 navController에서 currentDestination.lable 을 이용해서 현재 가리키고 있는 프래그먼트를 받아올 수 있고, 이걸 활용할 수 있다.
3. 홀드 상태에서, 홀드를 다시 켜면, activity가 재생성되는 이슈 (실행이 두번 됨. 화면끄기 옵션이 켜져있다면 그것도 두번 됨)
-> 아래 옵션들을 추가하여 해결
android:screenOrientation="portrait"
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout|smallestScreenSize"
4. Activity, Fragment 재생성
-> 화면이 홀드된 상태에서 FinishFragment가 호출되었을 경우에, 화면을 다시 켜면 특정 기기에서 간혹 가다 onCreate가 재생성 될 때가 있다.
이는 configChanges나 onConfigurationChanged() 로 잡을 수 없는 영역이었다.
그래서,, Activity나 Fragment가 재생성 될 경우에 onSavedInstance에 null이 아닌 값이 들어오는 점을 이용해서
onSavedInstance가 null이 아닐 경우에만 화면 홀드기능이나 pip를 적용하도록 수정했다. 나머지 기능들은 그대로 냅둬도 문제 없다.
5. PreferenceDataStore의 융합성..?
이번 프로젝트에 SharedPreference의 대체제인 PreferenceDataStore를 도입했다.
근데 중요한건, 여기서 서로 다른 key들이라도, 하나의 key에 대한 값에 변경이 있을때, 다른 모든 key에 대한 flow가 재호출된다.
즉 collect 하고 있다면, 제자리 호출이 된다는 것이다. 결국엔 같은 파일을 edit 하기 때문에 그렇다.
이걸 이제야 깨달았따.. 아마 이전에도 이런 문제가 영향을 끼치진 않았을까 싶다.
즉 Agreement 값을 false -> true로 변경했지만, 같은 파일이기에
Accept 값에 대한 flow도 갱신된다.
: 이 방법을 해결하기 위해선
1. dataStore 파일을 따로 분리하는 방법이 있고 (같이 갱신될 필요가 있는 것들은 하나의 파일로, 아니라면 개별 파일로 분리)
2. distinctUntilChanged()를 이용하는 방법이 있다.
flowA().distinctUntilChanged().collect { }
distinctUntilChanged()는, 이전에 collect한 값과 비교하여, 다를 경우에만 호출하여 리소스 낭비를 막는다.
-> 난 두 가지 방법 모두 적용해서 해결했다.
오늘 테스팅은 API 26, API 33, 내 기기, 예뮬레이터 모두 테스트를 진행해봤다.
아직 해결되지 않은 문제 ( 앱 업데이트 시 발생할 수 있는 문제 )
앱을 업데이트하게되면, 현재 실행중인 Alarm이 없어진다. 즉 포그라운드 서비스도 없어진다.
그렇기 때문에, 예약을 맞추고 기다리셨던 분들 중에,, 그 사이에 앱이 업데이트되면서 예약이 취소되었을 것이다.
그런데도 불구하고 "동작중입니다" 화면에서는 0분0초가 되어도 천이되지가 않고 계속 흘러나갔을 것이다.
그렇기에 많은 분들이 아마 앱을 삭제하지 않으셨을까 싶다.
앱이 그동안 자주 업데이트되었는데,, 앞이 캄캄하다. 이에 대한 깨달음은 얻었지만 해결책은 아직 내놓지 못했다.
앞으로 업데이트에 신중해야하고, 현재 타이머가 동작중인데도 예약된 알람이 없다면, 알람을 등록시켜주는 메커니즘이 필요하겠다.
: 이건 디버깅에서만 이러는지, 스토어에서도 이러는지 직접 내가 타이머를 맞추고 앱을 스토어에서 업데이트하여 테스트해봐야겠다.
두 가지 폰 모두 업데이트해봄
→ 일단 화면 끄기 기능 켰는데 업데이트 잘 되었고, 포그라운드 서비스인 Notification이 사라졌다.
→ 이상한게, 정해진 시간에 앱은 실행은 된다. 근데 setDestionation으로 정해놓은 finishFragment 도 아니고 trigger state도 아닌 그냥 메인화면이다. isRunning의 문제도 아니고 그냥 PendingIntent인 NavBuilder 자체가 제대로 동작 안하는 것 같다. 그렇기에 당연히 finishFragment에서 동작하는 음악같은것들은 동작하지 않음. 그리고 room이나 dataStore은 잘 반영되어 있다.
+ 실질 스토어 업뎃이 아닌, 디버깅 재설치에서는 알람 자체가 동작하지도 않는다.
그래서 NavDeepLinkBuilder 대신 PendingIntent.getActivity()를 사용해볼 지 고민중이다.
PendingIntent에서 putExtra를 통해 데이터를 넣고, EntryActivity가 실행될 때 intent의 데이터를 열어서
FinishFragment로 향해야 할 것 같다면, 직접 FinishFragment로 상태를 천이해줘야 한다는 것.
이외에도 DeepLink를 생성하는 방법이 있는지 찾아보고 있다.
위, '앱 업데이트 시 발생할 수 있는 문제' 해결방안을 찾았다.
MY_PACKAGE_REPLACED 를 활용하는 것이다.
https://woochan-dev.tistory.com/38
https://ddolcat.tistory.com/224
MY_PACKAGE_REPLACED 를 BraodcastReceiver에 등록하여, 앱 업데이트시 리스너를 받고 추가 사항을 재설정하는 것이다.
위에 나와있는대로
1. BroadcastReceiver를 생성하여 정의,
2. BroadcastReceiver를 Manifest에 등록해주고,
3. build.gradle에서 버전코드와 버전이름을 올려준 뒤
앱을 업데이트하면 된다고 한다. 근데 아직 안드로이드 스튜디오에서 성공해보진 못했다. 내일 더 진행할 예정.
사용자는 기다려주지 않는다. 그리고 떠난 사용자는 돌아오지 않는다. 더 열심히 해야한다.
'[개발 일지]' 카테고리의 다른 글
Google playstore SEO 테스트 (0) | 2023.05.21 |
---|---|
POST_NOTIFICATIONS 에 대해 (0) | 2023.05.21 |
쓸데없는 선물, 웃긴 선물 모음집 사이트 (0) | 2023.05.17 |
[2023.05.16] 당신이 잠든 사이에 리뉴얼 출시 이후.. (0) | 2023.05.16 |
안드로이드 테스팅의 중요성 (0) | 2023.05.15 |