일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 막내의 막무가내
- 프래그먼트
- 안드로이드 sunflower
- 막내의 막무가내 알고리즘
- 막내의막무가내 코틀린 안드로이드
- Fragment
- 프로그래머스 알고리즘
- 주엽역 생활맥주
- 주택가 잠실새내
- 막내의막무가내 코볼 COBOL
- 막내의막무가내 안드로이드
- 2022년 6월 일상
- 막내의막무가내 플러터 flutter
- 막내의막무가내 일상
- 막내의막무가내 알고리즘
- flutter network call
- 부스트코스에이스
- 부스트코스
- 막내의막무가내
- 막내의막무가내 안드로이드 에러 해결
- 막내의막무가내 목표 및 회고
- 막내의막무가내 프로그래밍
- 막내의막무가내 플러터
- 안드로이드
- 막내의막무가내 안드로이드 코틀린
- 막내의막무가내 코틀린
- 안드로이드 Sunflower 스터디
- 막내의막무가내 rxjava
- 막내의막무가내 SQL
- 막무가내
- Today
- Total
막내의 막무가내 프로그래밍 & 일상
[안드로이드] 서비스(Service) 본문
카톡 화면이 보이지 않는 상태에서 메시지가 왔다고 알림 화면이 뜨는 경우를 볼 수 있습니다.
이것은 카톡 앱이 사용자의 눈에 보이지 않는 상태에서도 무언가 실행되고 있다는 것을 의미합니다.
화면이 없이도 데이터를 주고받는 기능을 실행하고 때로는 메시지를 받아서 처리해야 하는데 이 때 사용되는 것이 서비스입니다.
서비스는 화면이 없는 상태에서 실행되는 하나의 애플리케이션 구성요소입니다.
요즘에는 인터넷을 통해 데이터를 주고받는 경우가 많은데 이때 대부분 서비스라는 것을 사용하게 됩니다.
서비스
앱을 실행했을 때 화면이 항상 보이는 것은 아닙니다.
다시 말해 화면을 띄우지 않고도 필요한 기능을 실행할 수 있습니다.
화면 없이 백그라운드에서 실행되는 하나의 단위를 서비스(Service)라고 부릅니다.
서비스는 애플리케이션 구성요소이므로 프로젝트에 추가할 때 반드시 매니페스트 파일에도 추가해야 합니다.
매니페스트에 추가할 때는 <service> 태그를 사용합니다.
다만 New 메뉴를 이용해 새로운 서비스를 만들면 <service> 태그가 자동으로 추가됩니다.
서비스는 startService 메소드를 호출하면 시작됩니다.
서비스도 onCreate와 onDestroy 메소드가 있어서 메모리에 만들어질 때와 메모리에서 없어질 때 자동으로 호출됩니다.
서비스는 항상 실행되어 있을 수 있도록 비정상 종료되는 상황이 벌어지더라도 시스템에 의해 자동으로 재시작됩니다.
자동으로 재시작되는 서비스
startService 메소드를 호출할 때도 인텐트 객체를 파라미터로 전달해야 하며 이 인텐트 객체는 시스템으로 전달된 후 시스템에서 지정한 서비스를 만들고 실행하는 과정을 거치게 됩니다.
서비스로의 명령 전달
서비스가 자동으로 재시작되게 하는 것이 일반적이다 보니 앱이 실행된 후에 startService 메소드를 이용해 서비스를 시작시키기만 하면 더 이상 startService 메소드를 호출할 일이 없지 않을까요?
그렇지 않습니다.
이미 알고 있는 것처럼 인텐트를 이용해 서비스를 시작시키면 인텐트 객체가 서비스로도 전달됩니다.
그리고 그 안에 부가데이터를 넣어 전달할 수 있으므로 서비스로 데이터를 전달하고 싶은 경우에는 startService가 더 자주 호출될 수 있습니다.
그런데 이 때의 startService 메소드는 서비스를 시작시키기 위한 목적이 아니라 명령이나 데이터를 전달하기 위한 용도로 사용됩니다.
이렇게 startService 메소드를 호출하면서 인텐트 안에 넣어 전달한 명령이나 데이터를 잘 처리할 수 있도록 onStartCommand라는 메소드를 사용할 수 있습니다.
새로운 서비스 클래스를 정의할 때는 다음과 같이 onCreate, onStartCommand, onDestroy 메소드를 재정의하는 경우가 많습니다.
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() 호출됨.");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand() 호출됨.");
return super.onStartCommand(intent, flags, startId);
}
}
위 코드에서 onStartCommand의 매개변수인 intent에서 액티비티로부터 데이터를 전달받아 필요한 서비스를 실행 할 수 있습니다.
서비스에서 액티비티로 데이터 전달
서비스에는 화면이 없다 보니 사용자에게 무언가를 보여주고 싶다면 액티비티로 데이터를 전달한 후 액티비티에서 보여주어야 합니다.
서비스에서 액티비티로 데이터를 전달할 때는 인텐트를 사용하며 인텐트 안에 부가데이터를 넣어 보냅니다.
Intent showIntent = new Intent(getApplicationContext(), MainActivity.class);
showIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
showIntent.putExtra("command", "show");
showIntent.putExtra("name", "mike");
startActivity(showIntent);
화면이 없는 서비스에서 화면이 있는 액티비티를 띄울 때는 태스크(Task)를 새로 만들어서 연결해야 합니다.
이 때문에 FLAG_ACTIVITY_NEW_TASK 플래그를 추가해주게 되는데 일반적인 경우 세 개의 플래그를 같이 사용합니다.
액티비티가 화면에 보인 상태에서 위와 같이 startActivity를 호출하면 액티비티는 새로 만들어지지 않고 기존 액티비티를 그대로 사용하게 됩니다.
그리고 액티비티의 onNewIntent 메소드가 자동으로 호출됩니다.
@Override
protected void onNewIntent(Intent intent) {
processIntent(intent);
super.onNewIntent(intent);
}
출처 및 참고:
https://www.edwith.org/boostcourse-android/lecture/17068/
https://developer.android.com/guide/components/services?hl=ko
'안드로이드 > 자바 & Previous' 카테고리의 다른 글
[안드로이드] 프래그먼트 백스택 (fragment backstack) (4) | 2019.08.10 |
---|---|
[안드로이드] 리사이클러뷰 , 스와이프리프레쉬아웃 함께 사용 ( recyclerview, SwipeRefreshLayout) (2) | 2019.08.10 |
[안드로이드] 노티피케이션 FCM 정리 ( 누르면 해당 액티비티와 내용 불러올 수 있도록) (0) | 2019.08.05 |
[안드로이드] EditeText 글자 힌트 및 크기 변경 (0) | 2019.07.30 |
[안드로이드] 인플레이션 이해하기 (0) | 2019.07.22 |