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)' 카테고리의 다른 글
Android NetworkOnMainThreadException 과 해결방안 (501) | 2017.08.05 |
---|---|
[안드로이드 코딩_009] 안드로이드 인텐트와 인텐트 필터 (1회) (504) | 2017.07.28 |
[안드로이드 코딩_007] Android Service (1회) (6) | 2017.07.14 |
[안드로이드 코딩_006]Activity LifeCycle (안드로이드 생명주기) (9) | 2017.04.28 |
[안드로이드 코딩_005]Android Studio UI (5) | 2017.02.22 |