관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] 서비스(Service) 본문

안드로이드/자바 & Previous

[안드로이드] 서비스(Service)

막무가내막내 2019. 8. 6. 12:20
728x90

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

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

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

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

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

 

서비스

앱을 실행했을 때 화면이 항상 보이는 것은 아닙니다.

다시 말해 화면을 띄우지 않고도 필요한 기능을 실행할 수 있습니다.

화면 없이 백그라운드에서 실행되는 하나의 단위를 서비스(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/

 

[LECTURE] 1) 서비스 : edwith

들어가기 전에 카톡 화면이 보이지 않는 상태에서 메시지가 왔다고 알림 화면이 뜨는 경우를 볼 수 있습니다. 이것은 카톡 앱이 사용자의 눈에 보이지 않는 상태에서도 무언가 실행되고 ... - 부스트코스

www.edwith.org

https://developer.android.com/guide/components/services?hl=ko

 

서비스  |  Android Developers

A Service is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switche

developer.android.com

 

728x90
Comments