'안드로이드 서비스'에 해당되는 글 2건

ANDROID Service (2)




소멸된 서비스 재시작 옵션 제어

onStartCommand() 메서드는 반드시 정수를 반환해야 합니다. 정수는 안드로이드 시스템이 서비스를 중단시킨 경우 시스템이 해당 서비스를 어떻게 것인가를 정의하는 값입니다.

반환 가능한 값은 반드시 다음 상수 하나여야 합니다.

 

START_NOT_STICKY

  • 전송 대기중인 Intent 있는 경우가 아니라면 서비스 중단 다시 시작시키지 말라고 시스템에게 전달합니다.

  • 이는 서비스가 불필요하게 실행되는 일을 피할 있게 해주는 가증 안전한 옵션입니다.

  • 애플리케이션이 완료되지 않은 모든 작업을 단순히 재시작 있을 좋습니다.


START_STICKY

  • 시스템이 onStartCommand() 메서드 반환 후에 서비스를 중단시키는 경우 서비스 소멸 최대한 빠르게 서비스가 다시 시작되어야 한다는 것을 의미 합니다.
  • 전송 대기중인 Intent 없다면 null Intent 값을 인자로 받는 onStartCommnad() 콜백 메서드가 호출됩니다.
  • 전송 대기중인 Intent 있다면 해당 Intent 전달 됩니다
  • 무기한으로 실행 중이며 작업을 기다리고 있는 미디어 플레이어 같은 애플리케이션에 적합합니다.

 

START_REDELIVER_INTENT

  • 만약 onStartCommand() 메서드의 실행 서비스를 중단시키는 경우 마지막으로 전달된 Intent onStartCommand() 호출하여 서비스가 다시 시작되어야 한다는 것을 의미 합니다.
  • 모든 전송 대기중이던 Intent 순차적으로 전달 됩니다.
  • 파일 다운로드와 같이 즉시 재개되어야 하는 작업을 수행중인 서비스에 적합합니다. 

 

■ 매니페스트 파일에 서비스 선언

MyService.java 로 정의한 서비스가 있을 경우 <application> 항목에 추가 하면 됩니다. 

아래 샘플에서는 <application> 항목 안에 <activity> 속성 아래에 추가 했습니다. 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tutorial.james.androidtutorialtest">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<service android:name=".MyService" />

</application>

</manifest>

service 는 기복적으로 public 으로 선언 됩니다. 즉, 서비스가 애플리케이션 패키지 외부의 컴포넌트들이 액세스 할 수 있다는 의미 입니다. 서비스를 private 로 만들려면 android:exported 속서을 false로 추가 하시면 됩니다. 

<service android:name=".JamesService" 
android:exported="false"/>



서비스 시작

Activity 다른 구성 요소에서 서비스슬 시작하려면 Intent(시작할 서비스) startService() 함수에 전달 하면 됩니다.

그러면 Android 시스템이 서비스의 onStartCommand() 호출하고 여기에 Intent 전달합니다. (절대로 onStartCommand() 직접 호출하면 안됩니다.)

MyService.java 정의된 서비스가 있다고 가정 하고 이를 Activity 시작하려면 startService() 인텐트를 전달하면 됩니다

Intent intent = new Intent(this, MyService.class);
startService(intent);


■ 서비스 중단

시작된 서비스는 자신만의 Service Lifecycle(생명주기)를 직접 관리해야 합니다. 즉, 안드로이드 시스템이 메모리가 부족하여 서비스를 중단 시키거나는 경우가 아니라면 직접 stopSelf() 를 호출하거나 다른 구성 요소가 stopSevice() 를 호출하여 이를 중단 시킬수 있습니다. 

stopService(intent);


■ 시스템 구동 시 서비스 시작 시키기

안드로이드 시스템이 최초 부팅되는 시점에 자동으로 서비스가 시작되도록 하는 방법입니다. 

이는 BroadcastReceiver 를 이용하여 처리 가능합니다. 


방법은 다음 링크를 따라 이전에 작성한 포스팅 참조 하세요 :)

☞ 포스팅 보러 가기 



블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,

Android Service


Android Service 사용자가 응용프로그램을 종료 하거나 다른 응용프로그램으로 전환을 하더라도 백그라운드(화면으로 보이지 않는 뒷단)에서 장시간 계속해서 동작하도록 제공하는 기능입니다. 또한 구성 요소를 서비스에 bind하여 서비스와 상호작용할 있으며 다른 프로세스간의 통신을 수행 수도 있습니다.


미디어플레이어, MP3 플레이어, 알람앱 등이 Android Service 이용한 App입니다.


Service Thread 아니며, 아래와 같이  가지 형식을 제공합니다.

 

Started Service (시작된 서비스)

Activity 또는 BroadCastReceiver 같은 다른 애플리케이션 요소들이 Context.startService() 함수를 호출 함으로써 시작되게 됩니다. Service 한번 시작되면 Service 중단되거나 리소스 해제를 위해 안드로이드 런타임 시스템에 의해 해제 되는 시점까지 백그라운드에서 무한정 실행됩니다. Service 자신을 실행시킨 애플리케이션이(우리가 일반적으로 이야기하는 App) 이상 포그라운드(사용자 입장에서 봤을 실행 - 화면을 있는 상태) 있지 않아도 백그라운드에서 실행되고 있습니다.

 

Service Context.stopService() 또는 stopSelf() 함수가 호출 되기 전까지 지속적으로 동작하게 됩니다.

Context.startService() 중복 호출의 결과로 여러 차례 호출 결과를 받게 되더라도 중복 Context.startService() 호출이 중첩되지 않아 Context.stopService() 또는 stopSelf() 한번이라도 호출 되면 Service 중단되게 됩니다.

 

Service 안드로이드 시스템에 의해 높은 우선순위가 부여되며 리소스 해제를 위해 종료될 때도 가장 마지막에 고려 대상이 됩니다.

 

Bound Service (바인드된 서비스)

애플리케이션의 구성 요소가 자신에게 바인드될 있도록 허용하는 서비스이며, bindService() 호출하여 오래 지속되는 연결을 생성합니다.

 

Started Service 유사하지만 Started Service 결과를 반환하지 않으며 자신을 호출한 컴포넌트와의 상호작용도 허용하지 않는 반면 Bound Service 자신을 호출한 컴포넌트와의 상호작용을 허용하고 결과를 받을 있습니다. , Activity Application 다른 구성요소에서 Service 상호작용하기를 원하는 경우 바인드된 서비스(Bound Service) 생성해야 합니다. Application 기능 가지를 프로세스 통신 (IPC : Interprocess Communication) 통해 다른 Application 노출하고자 하는 경우에도 좋은 선택입니다

 

클라이언트가 시작되어 bindService() 함수를 호출하면 Bound Service 바인딩 됩니다.

 

Bound Service onBind() 콜백 함수를 구현하여야 합니다. Service 최초 생성될 때와 이후에 다른 클라이언트들이 Service 바인딩 모두  onBind()  함수가 자동 호출됩니다. onBind() 함수의 목적은 바인딩한 클라이언트들에게 IBinder 타입의 객체를 반환하는 것입니다.

다시 정리 하자면 클라이언트와 Service 사이에서 쓰이는 인터페이스는 반드시 IBinder 타입의 객체의 구현이어야 하며 이를 서비스가 onBind() 콜백 메서드에서 반환해야 합니다. 클라이언트가 IBinder 수신하면 해당 인터페이스를 통해 서비스와 상호작용을 시작할 있습니다.

 

클라이언트는 바인드된 서비스를 이상 필요로 하지 않을 unbindService() 호출해야 합니다. 마지막 바인딩 클라이언트가 Service 에서 바인딩을 해제하면 안드로이드 런타임 시스템이 해당 Service 종료 시킵니다.

 

 

Service Lifecycle (서비스 생명주기)

Service 생명 주기는 Activity 생명 주기보다 훨씬 간단하지만 Service 생성하고 해제하는 방법에 특히 주의 해야 합니다. Service 사용자가 모르는 채로 백그라운드에서 실행될 있기 때문입니다.

 

Service Lifecycle  아래 이미지와 같이 서로 다른 가지 경로를 따를 있습니다. 왼쪽이 Serviced Service 이며 오른쪽이 Bound Service 입니다. 참고하세요.




1. Started Service (시작된 서비스)

다른 구성 요소가 startService() 호출하면 Service 생성됩니다. Service 무한정 실행 있으며 stopSelf() 호출하여 자체적으로 중단해야 합니다. 다른 구성 요소도 Context.stopService() 호출하여 Service 중단할 있습니다. 서비스가 중단되면 안드로이드 런타임 시스템이 이를 소멸 시킵니다.


2. Bound Service (바인드된 서비스)

클라이언트가 bindService() 호출하면 서비스가 생성됩니다. 클라이언트가 IBinder 인터페이스를 통해 서비스와 통신을 주고 받을 있으며 클라이언트가 연결을 종료하려면 unbindService() 호출하면 됩니다. 여러 클라이언트가 같은 Service 바인드될 있으며, 모두가 바인딩을 해제하면 시스템이 해당 서비스를 소멸시킵니다. (Started Service 달리 Service 스스로를 중단시키지 않아도 됩니다)

 

 

내용이 어렵게 느껴질 있겠는데요 ^^;

마지막 Service Lifecycle 부분이 Service 대한 요약이라 보시면 무방합니다.

 

 

 

Referenced By -

https://developer.android.com/reference/android/app/Service.html

https://www.tutorialspoint.com/android/android_services.htm

블로그 이미지

쉬운코딩이최고

Android, Java, jsp, Linux 등의 프로그래밍 언어를 소개 합니다.

,