티스토리 뷰
꽤 오래된 사골이긴 하지만,
시작한 김에 예전에 Android M에서 한번 맨붕이 왔던 Doze 모드 처럼,
가장 최근 O에서 startForegroundService 함수에 관한 개인적인 생각을 정리해 본다. - (OS P.... 시대에 O 관한 고찰이라니...)
Android를 개발하다보면,
4가지의 Android 컴포넌트에 대해 많은 공부가 필요하지만 사실 간과하고 개발하시는 분들이 많다.(나 역시 그랬고...)
그 중 백그라운드 작업에서 사용하는 Service라는 요놈!
안그래도 Activity와 연동하는 방법등등 초보자에겐 난해한 점이 많은 컴포넌튼데,
작년즈음 Android O에서 백그라운드에서 서비스를 시작할 수 없는 상황이 발생하여,
멘붕이 왔다.
사실 사용자 입장에서 봤을때 O에서 변경 된 정책이 맞긴 맞다.
어느 사용자가 나도 모르는 사이에 어플이 실행 되고 있는 상태를 좋아하겠는가...(데이터, 베터리 사용등등...)
암튼... 서론이 길었는데,
저 내용만으로도 멘붕이긴 했는데,
더욱 멘붕이 왔던건.... 그 처리방식이었다...
대부분 사람들의 예외처리는 다음과 같았다.
-- 실행 루틴
Intent serviceIntent = new Intent(context, TestService.class);
if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODS.O )
context.startForegroundService(serviceIntent);
else
context.startService(serviceIntent);
-- 서비스 처리방식
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODS.O ) {
// 노티 객체 생성
startForeground(노티아이디, 노티객체)
}
// todo...
}
그런데 생각해보면, 이런방식일 경우, 어플이 포어그라운드 상태이더라도 Android O에서는 노티를 무조건 띄워 줘야한다.
그런 의도로 Android O에서 이런 정책이 생겼을까...? 라는 생각을 해보면,(실제로 사용자들도 무조건 생기는 상단 알림바에 대해 불만이 많았었다.)
위와 같은 방식은 기능에는 문제 없을지 몰라도 해당 정책이 생긴 정확한 의도를 모르고 구현했다는 개인적인 생각이 들어 다음과 같이 수정했다.
-- 실행 루틴
Intent serviceIntent = new Intent(context, TestService.class);
try {
context.startService(serviceIntent);
} catch( IllegalStateException e ) {
if( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODS.O ) {
intent.setAction("NOTI_ON");
context.startForegroundService(serviceIntent);
}
}
-- 서비스 처리방식
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if( null != intent && null != intent.getAction() ) {
if( "NOTI_ON".equals(intent.getAction()) && android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODS.O ) {
// 노티 객체 생성
startForeground(노티아이디, 노티객체)
}
}
// todo...
}
물론, 어플의 성향 및 기타 기능에 따라 조금씩 틀리겠지만,
백그라운드에서 서비스 시작을 막은 이유는 백그라운드 동작은 사용자에게 명시적으로 알려야한다. 라는게 핵심이 아닐까?
다시 한번 개발을 위한 개발자가 되지 말자고 다짐한 계기가 된 사건이었다.
'Android Memo' 카테고리의 다른 글
Glide 모듈을 사용 한 비동기 이미지를 포함하는 노티피케이션 띄우기 (0) | 2018.12.07 |
---|---|
Android ViewPager 내부 View에 클릭 이벤트가 있을 경우 해당 View 페이징이 안되는 증상. (0) | 2018.11.16 |
안드로이드 Sol Prime 단말 fontFamily 설정 오류 (0) | 2018.11.06 |
Android Dialog Show 할때 Animation 적용하기 (0) | 2018.10.24 |
Android AnimationDrawable OneShot 옵션 시 Finish 타이밍 캐치하기 (0) | 2018.10.24 |
- Total
- Today
- Yesterday
- android o
- Android Custom Dialog
- glide
- fontFamily
- AnimationDrawable
- buildToolsVersion 31.0.0
- ViewPager
- startForegroundService
- FrameAnimation
- 문자열
- notification
- String append
- Android 더블 클릭
- targetSdkVersion 31
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |