이번 포스팅에선 안드로이드 스튜디오 4대 컴포넌트중 하나인 서비스를 알아보겠다.
서비스는 무슨일을 할까?
• 액티비티와 상관 없이 백그라운드에서 동작하는 component
• 서버로부터 contents 다운로드
• 멜론/지니
• DB에 저장
• Wi-Fi, BLE 연결
안드로이드 서비스를 만드는법
생성시에 이런 화면이 나타난다. 첫번째 사진처럼 생성시에 Service로 만들면
AndroidManifest에 자동으로 서비스가 등록된다.
onCreate()
- 서비스가 처음 생성되었을 때(즉 onStartCommand(),onBind()를 호출하기 전) 호출되어 일회성 설정 절차를 수행
- 서비스가 이미 실행중인 경우, 호출되지 않음
onStartCommand()
- 구성 요소가 서비스를 시작하도록 요청하는 경우 호출됨 (startService()를 호출 한 경우)
- 이 메서드가 실행되면 서비스가 시작되고 백그라운드에서 무한히 실행됨
- 서비스를 중단하는 것은 개발자의 책임이며, stopSelf() 또는 stopService()를 호출하면 됨
- 바인드 서비스를 제공하려면, 이 메서드를 구현하지 않아도 됨
onDestroy()
- 서비스를 더 이상 사용하지 않고 소멸시킬 때 호출됨
- 스레드, 등록된 리스너 또는 수신기 등의 각종 리소스를 정리하기 위해 이것을 구현해야 함
- 서비스가 수신하는 마지막 호출
onBind()
- 다른 구성 요소가 해당 서비스에 바인딩되고자 하는 경우에 호출됨 (bindService()를 호출 한 경우)
- 클라이언트와 서비스와 통신을 주고받기 위해 사용할 인터페이스를 제공해야 함
- 이때 IBinder를 반환하면 됨
- 바인딩을 허용하지 않으려면 null을 반환하면 됨
직접 서비스를 구현해봅시다.
실험으로 서비스를 실행하면, 서비스를 10초재우는 기능을 구현해봅시다.
하지만 이상한점이 발견됩니다. tid (Thread ID)를 보시면, 메인 쓰레드와, 서비스 쓰레드가 똑같습니다.
서비스란, 메인쓰레드와 개별적으로 백그라운드로 실행되어야하는데, 같은 쓰레드를 공유하고있습니다.
이말은 즉, 다운로드가 1분이 걸린다면, 다운로드하는중에 아무런 요청이 불가능한 상태가됩니다.
-> 이를 해결하기위한 서비스 기능인 IntentService가 있습니다.
IntentService 사용해보기
IntentService를 extends를 해줍니다.
IntentService는 필수적으로 생성자 하나와, onHandleIntent를 생성해야합니다.
Handle에서 눈치채셧겠지만, 멀티스레드를 지원합니다.
아까와 동일하게 쓰레드를 10초 재우는 기능을 구현해봅시다.
메인쓰레드의 tid는 3933 MyIntentService()의 tid는 3961로 제대로 멀티스레드가 구현이되었습니다.
하지만, IntentService는 Duplicated한(낡은) 라이브러리다.
IntentService , onHandleIntent 처럼 취소선이 되어있는걸 볼 수 있습니다.
그럼 무엇을써야할까요?
• JobService, JobIntentService
• (구글 추천)Worker, WorkManager
간략하게 해석을 해보자면, IntentService와 비교해서
WorkManager는 프로세스가 죽는경우를 막을수있고,
Doze mode와 OS에서 발생하는 제약들을 관리해준다.
이럴때 사용하면좋다:
1.미디어 업로딩과 같은 장기적으로 백그라운드로 실행될 작업
2.파싱과 데이터를 데이터베이스에 저장할때
3. 중요한 작업에서 프로세스가 죽는걸 방지하기위해
결론은 상황에따라서 jobService 나 WorkManager를 사용해야 한다.
이상 서비스가 무슨일을 하고, 어떻게 구현하면 되는지 알아보았습니다.
감사합니다.
'안드로이드 스튜디오 > Java' 카테고리의 다른 글
안드로이드 스튜디오: 컨텐츠 제공자 (Content Provider) (0) | 2021.12.11 |
---|---|
안드로이드 스튜디오: 브로드캐스트 리시버(BroadCast Reciver) (0) | 2021.12.10 |
안드로이드 스튜디오 : SQLite 사용 (0) | 2021.11.30 |
안드로이드 스튜디오 : 데이터 파일 처리하기 (0) | 2021.11.26 |
안드로이드 쓰레드(Thread2) Handler 사용 (0) | 2021.11.12 |