0. "서비스" 하기 전에 간단 설명

- 카톡 화면이 보이지 않는 상태에서 메시지가 왔다고 알림 화면이 뜨는 경우를 볼 수 있습니다.

 

- 이것은 카톡 앱이 사용자의 눈에 보이지 않는 상태에서도 무언가 실행되고 있다는 것을 의미합니다.

 

- 화면이 없이도 데이터를 주고받는 기능을 실행하고 때로는 메시지를 받아서 처리해야 하는데 이 때 사용되는 것이 "서비스"입니다.

 

- "서비스"는 화면이 없는 상태에서 실행되는 하나의 애플리케이션 구성요소입니다.

 

- 요즘에는 인터넷을 통해 데이터를 주고받는 경우가 많은데 이때 대부분 "서비스"라는 것을 사용하게 됩니다.

 

 

서비스에 대해 알아봅시다.

 

 

"서비스"는!!!!!

화면은 없는데, 뭔가 기능은 하는 거 같고

데이터를 주고 받는 걸 잘함.

 

 

 

 

 

1. 설명

- 화면이 없는 것을 말한다.

 

- 액티비티(맨날 쓰던거)랑 다른거임.

 

- 화면이 없더라도 뭔가 기능이 실행될 수 있게 해주는게 "서비스"이다.

 

- (참고)애플리케이션 구성요소 중에 하나이다.

  (참고)그러니깐 이것도 시스템에서 관리를 아마 할 것이다.

 

 

그래서

 

"서비스"

처음에 메모리에 만들어 질 때,

oncreate()가 있고,

메모리가 없어지는 시점에,

onDestory()라는 것이 있다.

 

근데 중요한게 있다!!

"서비스"는 뒤에서 계속 실행되어야 하는 기능이 가장 기본적인 기능 중에 하나이다.

 

(참고)

서비스가 CPU가 크기가 적어서 

시스템이 자동으로 만든 서비스를 종료를 시켰다고 하더라도,

비정상적으로 종료가 되었다고 하더라도,

시스템이 자동으로  재시작시켜준다.

 

그리고

 

startActivity()가 화면을 실행하는 거잖아요!!

"서비스"startService()로 서비스를 시작하게 됩니다.

 

 

 

(참고)

 

 

 

 

 

 

 

2. 서비스 만드는 방법 & 사용법

1) Service 생성

app -> New -> Service -> Service

"새로운 서비스 class를 하나 만들겠다."라는거 입니다.

그리고 이게 단순 class가 아니라

애플리케이션의 4개중에 하나인 구성요소이다.

구성요소 이기때문에

매니페스트에다가 애플리케이션의 구성요소를 그 정보를 등록해서 사용한다고 계속 했잖아요.

 

왜냐하면,

 

애플리케이션 구성요소시스템에서 관리를하고

앱이 실행이 될 때, 

Service라고 하는게 만들어져 있다고 하는 것을 알아야 하니깐!!!

 

 

"Finish" 클릭

 

 

 

만들어집니다.

 

 

 

그리고 매니페스트 코드 보면

"service태그"가 만들어집니다.

 

 

 

 

 

 

 

2) - 참고 -

 

 

 

 

 

 

 

 

3) 사용 방법

- 서비스를 동작을 시킬려면 startService() 를 사용하면 됩니다.

 

- MyService 프로젝트 안에 MyService 클래스를 만들었다.

(참고)프로젝트명 -> MyService

 

 

액티비티도 애플리케이션 구성요소이고, 서비스도 애플리케이션 구성요소이다,

시스템이 이것들을 관리 한다고 했죠!!! (4대 컴포넌트 관리하는거)

 

서비스도 시작을 시키는 것을 직접 시작을 못 시킨다.

시스템으로 요청을 해서 사용한다!

 

그러면 시스템에 요청을 할려면

시스템이 알아먹는 포맷을 사용해야하니깐,

"인텐트"를 사용하는 거다.

 

그리고

 

"인텐트"가 사용이 되면 

서비스쪽으로 뭔가 데이터를 전달을 하고 싶으면,

인텐트 안에 Extradata를 넣어서 사용할 수 있다. (putExtra())

 

 

 

 

 

 

 

4) 

그래서

버튼(서비스 시작)을 누르면

서비스가 시작하면서 

서비스쪽으로 데이터를 전달을 해볼 것이다.

 

 

- activity_main.xml -

에디터텍스트에 "히짱아" 입력

 

 

- MainActivity.java -

"서비스"는 4대 컴포넌트이니깐!!

4대 컴포넌트들은 intent로 왔다갔다 했으니깐!!!

intent 사용 하면됩니다!!

 

 

- MyService.java -

서비스로 동작하기위한 초기 셋팅!!

(onCreate(), onStartCommand(), onDestroy()은 오버라이드해줘서만들어주면됨)

 

 

서비스는 한번 실행되면, 계속 실행이 되어 있어요!

그러다 보니깐, 말은 startService() 인데(서비스를 시작하는 의미로 보이는데),

실제로는 startService() 를 아무리 여러번 실행 한다고 하더라도,

이미 만들어져 있으니깐 onCreate()로 새로 만들어 지지 않아요!

 

그래서 문제는,

인텐트 안에 넣어서 전달을 하는게

onCreate() 안에서 확인할 수 없는 문제가 생긴다.

그래서,

서비스는

인텐트로 전달한 Extradata들을 확인 할 때는,

onStartCommand()로 확인을 할 수 있따.!!

 

그래서,

MainActivity.java에서 보낸 Intent 객체를

onStartCommand()가 받아서 처리를 할 수가 있다.

 

onCreate(), onDestroy()는

서비스가 만들어 졌다, 없어졌다 하지만,

 

서비스의 특성 때문에

서비스는 한번 만들어지면 계속 실행 되어 있습니다!!!

 

그래서,

인텐트는 onStartCommand()에서 처리 한다.

(여기 메소드에서, 받은 값들 알아서 처리해주고 싶은거 해주면 됨).

 

 

 

- MyService.java (코드 추가)-

- "서비스 버튼"은 앞에서 만들었던 버튼 말하는거임 

- Log창에서 저렇게 실행됨(파란색)

  (Log결과코드 생략 했음)

 

 

 

 

 

 

 

 

 

 

 

 

5) 코드 구조