작성한 부스트코스 후기입니다.
여러분들의 성원에 더 노력하는 부스트코스가 되겠습니다.
감사합니다.
******************************************
1)링크: https://blog.naver.com/zhfptm12/221813194214
2)작성날짜: 20/02/18
카톡 화면이 보이지 않는 상태에서 메시지가 왔다고 알림 화면이 뜨는 경우를 볼 수 있습니다.
이것은 카톡 앱이 사용자의 눈에 보이지 않는 상태에서도 무언가 실행되고 있다는 것을 의미합니다.
화면이 없이도 데이터를 주고받는 기능을 실행하고 때로는 메시지를 받아서 처리해야 하는데 이때 사용되는 것이 서비스입니다.
서비스는 화면이 없는 상태에서 실행되는 하나의 애플리케이션 구성요소입니다.
서비스에 대해 알아보겠습니다.
서비스(Service)
앱을 실행했을 때 화면이 항상 보이는 것은 아닙니다.
다시 말해 화면을 띄우지 않고도 필요한 기능을 실행할 수 있습니다.
화면 없이 백그라운드에서 실행되는 하나의 단위를 서비스(Service)라고 부릅니다.
서비스는 startService 메서드를 호출하면 시작됩니다.
서비스도 onCreate와 onDestroy 메서드가 있어서 메모리에 만들어질 때와 메모리에서 없어질 때 자동으로 호출됩니다.
서비스는 항상 실행되어 있을 수 있도록 비정상 종료되는 상황이 벌어지더라도 시스템에 의해 자동으로 재시작됩니다.
startService 메서드를 호출할 때도 인텐트 객체를 파라미터로 전달해야 하며 이 인텐트 객체는 시스템으로 전달된 후 시스템에서 지정한 서비스를 만들고 실행하는 과정을 거치게 됩니다.
서비스로의 명령 전달
서비스는 자동으로 재시작합니다. 그래서 서비스가 시작되기만 하면 startService가 호출될 일이 없다고 생각할 수도 있습니다.
하지만 서비스를 시작시키기 위한 목적이 아니라 데이터를 전달하기 위한 용도로 많이 사용됩니다.
이렇게 startService 메서드를 호출하면서 인텐트 안에 넣어 전달한 명령이나 데이터를 잘 처리할 수 있도록 onStartCommand라는 메서드를 사용할 수 있습니다.
화면이 없는 서비스에서 화면이 있는 액티비티를 띄울 때는 태스크(Task)를 새로 만들어서 연결해야 합니다.
서비스에서 액티비티로 데이터 전달
서비스에는 화면이 없다 보니 사용자에게 무언가를 보여주고 싶다면 액티비티로 데이터를 전달한 후 액티비티에서 보여주어야 합니다.
서비스에서 액티비티로 데이터를 전달할 때는 인텐트를 사용하며 인텐트 안에 부가 데이터를 넣어 보냅니다.
화면이 없는 서비스에서 화면이 있는 액티비티를 띄울 때는 태스크(Task)를 새로 만들어서 연결해야 합니다.
이 때문에 FLAG_ACTIVITY_NEW_TASK 플래그를 추가해주게 되는데 일반적인 경우 세 개의 플래그를 같이 사용합니다.
액티비티가 화면에 보인 상태에서 위와 같이 startActivity를 호출하면 액티비티는 새로 만들어지지 않고 기존 액티비티를 그대로 사용하게 됩니다.
그리고 액티비티의 onNewIntent 메서드가 자동으로 호출됩니다.
<생각해보기>
1. 어떤 경우에 액티비티가 아닌 서비스에서 기능을 실행하도록 해야 하는 걸까요?
- 해당 앱의 액티비티가 켜져 있는 상태가 아님에도 그 앱의 어떤 기능이 발생해야 할 때 사용될 것 같습니다.
2. 인터넷을 통해 데이터를 주고받는 기능을 액티비티에 넣어두는 경우 어떤 문제가 발생할 수 있을까요?
- 카톡 메시지나 알람과 같은 경우, 액티비티에서 주고받게 되면 해당 액티비티가 계속 켜지고 꺼짐을 반복하게 될 것 같습니다.
[출처] [부스트 코스] 안드로이드 - 서비스 03주 차|작성자 zhfptm12