STEEM/SCT 보팅파워(VP) 안드로이드 위젯 #3 - Doze와 앱 대기(App Standby) 이야기
안녕하세요. 안피곤입니다.
사실 스팀 위젯에 기능을 업데이트를 할 계획은 없었습니다. 그런데 막상 구현하고 보니 욕심이 계속 생깁니다. 앱에 버그도 있고 기능도 거의 없는게 계속 마음에 걸리네요.
그리고 위젯 UI 디자인은 포기했습니다. 해상도, OS 버전, 시스템 폰트 크기와 글꼴에 영향을 많이 받습니다. 안드로이드 UI 개발은 경험이 없어서 매우 어렵습니다. ㅠㅠ
이번에 @griend96님이 제안하신 기능을 넣었습니다. 바탕화면에 위젯을 여러개 설치할 수 있습니다. 부 계정을 여러개 가지고 있는 스팀잇 사용자에게는 유용할 것 같습니다.
사용 예시
저는 완(WHAN)팀 멤버들을 바탕화면 위젯에 추가하여 모니터링(?) 하고 있습니다. 이제 완팀에 @griend96도 합류하셔서 이제 6명이 되었습니다. 축하해주세요. ㅋ
사용방법
사용 방법은 매우 간단합니다. 아래 순서만 지키면 누구나 쉽게 바탕화면에 위젯을 추가할 수 있습니다. 저는 매우 직관적이고 간단한 사용방법을 구현하기 위해서 항상 노력합니다.
1. 바탕화면에 위젯을 추가한다. | 2. 스팀잇 아이디를 입력하고 확인을 누른다. |
---|---|
Doze 모드와 앱 대기(App Standby) 모드 이야기
Android 6.0 마시멜로(API 레벨 23)부터 Doze 모드라는 게 존재합니다. 앱이 Doze 모드나 앱 대기 모드(App Standby)에 들어가게 되면 네트워크 엑세스, Wake Lock, SyncAdapter, JobScheduler, AlarmManager이 작동하지 않게됩니다.
"이 이유 때문에 위젯앱 설치하고 하루가 지나면 업데이트가 되지 않았던 것입니다."
하지만 충전 중일때는 두 모드에서 빠져나옵니다. 해당 모드는 배터리를 아낄수 있어서 사용자에게는 매우 좋습니다. 하지만 개발자에겐 헬입니다. ㅠㅠ
그리고 삼성 갤럭시폰에는 스마트매니저(Smart Manager) 라는 녀석도 있습니다. 스마트 매니저는 장기간 사용하지 않는 앱을 강제로 잠재워 버립니다. 자장~ 자장~ ㅋ
결국 저는 Doze, App Standby, Smart Manager에 항복했습니다. 해당 모드에서 빠져나가는 것은 코드 레벨에서 처리할 수 없다고 판단내렸습니다.
Background Service를 버리고 Foreground Service로 개발하였습니다. Foreground Service는 해당 모드 영향을 안받는다고 합니다. 대신 서비스 동작시 상태바에 노티 알람 발생합니다.
위 화면에서 보는 거와 같이 서비스가 동작 중일때는 상태바에 아이콘이 표시됩니다. 만약 노티에 아이콘이 오랫동안 보인다면 사용자가 강제로 종료시킬 수 있습니다.
노티 알람 발생시 진동과 소리를 없애기
노티 알람 발생시 진동과 소리를 없애려면 아래와 같이 설정하세요.
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, "SteemWidget Service Channel", NotificationManager.IMPORTANCE_LOW);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setVibrate(null);
builder.setSound(null);
startForeground(1, builder.build());
Stack Overflow에서는
builder.setVibrate(null)
와builder.setSound(null)
적용하면 된다고 했습니다. 그런데 적용해도 진동과 소리가 발생합니다. 저는 채널에NotificationManager.IMPORTANCE_LOW
를 설정하니 진동과 소리가 나지 않습니다.
보팅 파워 계산 로직
안드로이드 Java 코드에서 보팅 파워는 다음과 같이 계산합니다. ISO 날짜 파싱을 위해서 SimpleDateFormat
를 사용하였습니다.
private static final long VP_REGENERATION_SECS_STEEM = 432000;
public static String calculateVotingPower(String lastVoteTime, int votingPower) {
try {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
Date d = df.parse(lastVoteTime+"+00:00");
double elapsed = (new Date().getTime() - d.getTime()) / 1000;
double vp = votingPower + (10000.0 * elapsed) / VP_REGENERATION_SECS_STEEM;
vp = Math.min(Math.floor(vp) / 100, 100);
return String.valueOf(vp);
} catch(Exception ex) {
Log.e(TAG,"", ex);
}
return "0";
}
날짜 계산에 Joda Time 라이브러리를 사용하고 싶었습니다. 하지만 React Native에서 릴리즈 빌드시 오류가 발생합니다. ㅠㅠ Low Level에서 오류가 발생하는 것 같아서 원인을 찾다가 포기했습니다.
- 구글 스토어 다운로드 링크: https://play.google.com/store/apps/details?id=com.steem_widget
리액트 네이티브 기반으로 스팀 위젯 앱 개발을 시작했습니다. 그런데 구현하다보니 여러가지 문제(?)로 위젯 기능을 안드로이드 Java로 다시 구현했습니다. 요 몇일동안 구글 문서보면서 Android 공부하느라 기능 업데이트가 늦어졌습니다. 그리고 피드백은 댓글로 남겨주세요.
위젯 기능을 제외하고는 다른 기능은 리액트 네이티브로 구현하면서 조금씩 업데이트 해보려고 합니다. ㅋ 참고로 저는 본업은 백엔드 개발자입니다. 프론트엔드와 모바일 개발은 취미로 하고 있습니다. 취미로 하는 개발이 더 재미있습니다.
마지막으로 안드로이드 위젯 개발하면서 참고했던 블로그 자료를 모두 공유합니다.
오늘도 해피 코딩하세요~!
관련 자료
- Doze 및 앱 대기 모드 최적화 | Android Developers: https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko
- 백그라운드 실행 제한 | Android Developers: https://developer.android.com/training/monitoring-device-state/doze-standby?hl=ko
- Android 8.0 동작 변경 사항 | Android Developers: https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=ko
- Android O에서의 백그라운드 처리를 위한 JobIntentService: https://medium.com/til-kotlin-ko/android-o%EC%97%90%EC%84%9C%EC%9D%98-%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C-%EC%B2%98%EB%A6%AC%EB%A5%BC-%EC%9C%84%ED%95%9C-jobintentservice-250af2f7783c
- Doze 모드에서 서비스 실행 방법: https://hashedin.com/blog/save-your-android-service-from-doze-mode/
- Android 오레오(API 26)에서 백그라운드 서비스 유지하는 방법: https://android.jlelse.eu/keep-those-background-services-working-when-targeting-android-oreo-sdk-26-cbf6cc2bdb7f
- [Android] 배터리 최적화 대응하기: 도즈(Doze)와 어플 대기모드(App Standby): https://m.blog.naver.com/PostView.nhn?blogId=nife0719&logNo=221029613969&categoryNo=26&proxyReferer=http%3A%2F%2Fwebs.co.kr%2Findex.php%3Fdocument_srl%3D3312655
- Google Developers Korea Blog: 안드로이드 6.0 마시멜로 무엇을 테스트 할까요? https://developers-kr.googleblog.com/2015/08/testyourapponandroid60.html
- adb로 안드로이드 배터리 상태 모킹(Mocking) 하기: https://www.intellectsoft.net/blog/android-shell-part-1-mocking-battery-status/
@시리즈
anpigon님의 글 검색 결과 'STEEM/SCT 보팅파워' 시리즈가 총 3건 검색되었습니다.
이전 글 : STEEM/SCT 보팅파워(VP) 안드로이드 위젯 #2 - 앱 업데이트 이야기
이제 안드로이드 자바는 안녕하시공 리액뜨에 전념하쉬길...!!!
안드로이드 전용개발자가 아닌한 비효율적인듯요 ㅋㅋㅋㅋ
어렵다 안드로이드 개발..!!!
기생충 잼나게 보시고용
Posted using Partiko iOS
안드로이드 개발은 행복한 코딩이 아닙니드아~
다시 리액트 네이티브에 전념하려고 합니다. ㅎㅎ
곰돌이가 @anpigon님의 소중한 댓글에 $0.010을 보팅해서 $0.013을 살려드리고 가요. 곰돌이가 지금까지 총 5003번 $56.149을 보팅해서 $63.603을 구했습니다. @gomdory 곰도뤼~
곰돌이가 @happyberrysboy님의 소중한 댓글에 $0.010을 보팅해서 $0.013을 살려드리고 가요. 곰돌이가 지금까지 총 5002번 $56.139을 보팅해서 $63.590을 구했습니다. @gomdory 곰도뤼~
happyberrysboy님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
happyberrysboy님의 [kr-dev] Firebase 데이터베이스 프로젝트 설정
Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 600K SP virus707 account.
아낌없이주는 나무에 대한 후원으로 왔어요. 미약하나마 보팅 하고 가요.
Posted using Partiko Android
Hi @anpigon!
Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
Your UA account score is currently 2.620 which ranks you at #14888 across all Steem accounts.
Your rank has improved 261 places in the last three days (old rank 15149).
In our last Algorithmic Curation Round, consisting of 178 contributions, your post is ranked at #119.
Evaluation of your UA score:
Feel free to join our @steem-ua Discord server
Congratulations @anpigon! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :
You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word
STOP
Vote for @Steemitboard as a witness to get one more award and increased upvotes!
li-li님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
li-li님의 스팀잇 KR 주식회사 - nTopaz(81) #190503
feelsogood님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
feelsogood님의 (SCT-EVENT) 땡을 잡아라~ #3
@steem.apps님께서 🎲주사위를 굴려 72 이(가) 나왔습니다.
300 코인 지원 Atomic 지갑 from @bewarecenterbase
@anpigon 님 제인하나 드려구요 제가 aaa sct actrnearn 을 모두하다 보니 ^^ 아이디에 더해서 코인이름도 좀 설정할수있게 해주시면 안될까요 ^^;
맨날 부탁만 드려서 감사합니다.
피드백 감사합니다. 다음 업데이트에 적극 반영하겠습니다. 하지만 요즘 본업이 바빠서 업데이트는 시간이 조금 걸릴것 같습니다. ㅠㅠ
괜찮습니다. 본업이 우선이죠 저도 본업때문에 취미개발은 엄두도 못내고 있습니다.
취미개발을 하시는군요. 취미로 개발하시는 것을 #kr-dev에도 한번 올려보세요. ㅋ