티스토리 뷰

꽤 오래된 사골이긴 하지만,


시작한 김에 예전에 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...

}


물론, 어플의 성향 및 기타 기능에 따라 조금씩 틀리겠지만,

백그라운드에서 서비스 시작을 막은 이유는 백그라운드 동작은 사용자에게 명시적으로 알려야한다. 라는게 핵심이 아닐까?


다시 한번 개발을 위한 개발자가 되지 말자고 다짐한 계기가 된 사건이었다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
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
글 보관함