카테고리 없음

안드로이드 서비스

병홍 2013. 7. 12. 21:20

안드로이드 서비스


1. 시스템 서비스 (Framework 제공)

1. 자바 시스템 서비스

1. 코어 플랫폼 서비스

Activity Manager 서비스

Window Manager 서비스

Package Manager 서비스

2. 하드웨어 서비스

Alarm Manager 서비스

Connectivity Service

Location Service

Power Service

Sensor Service

Telephony Service

Wifi Service


2. 네이티브 시스템 서비스

C++로 작성되어 있음

Audio Fuinger 서비스, Surface 서비스 등이 있음


시스템 서비스는 startService 또는 getSystemService API로 사용 가능 

부팅 시 미디어 서버와 시스템 서버에 의해 실행됨 

미디어 서버 : Surface를 제외한 Audio, Media와 같은 네이티브 시스템 서비스 실행

시스템 서버 : Zygote에 의해 실행되는 자바 기반의 프로세스로 Surface와 모든 자바 시스템 서비스 실행 

서비스는 Context Manager에 등록된다 


2. Service 상속한 어플리케이션 서비스

SDK에서 제공하는 Service 클래스 

UI 없이 주기적으로 특정한 일을 수행하는 백그라운드 프로세스 


바인딩 :   서비스를 원격 제어할 수 있게 서비스에 연결하는 것

바인딩 후에는 서비스가 제공하는 메소드를 이용. 즉, 서비스 제어 가능 


두 가지 생명 주기

1. startService() : 서비스의 시작/종료만을 위해서

onCreate -> onStartCommand -> 시비스 실행 -> 서비스 중단 -> onDestroy -> 서비스 종료

2. bindService() : 서비스의 원격 제어를 위해서

onCreate -> onBind -> 클라이언트와 서비스의 상호작용 -> onUnbind -> onDestroy -> 서비스 종료

onBind는 클라이언트가 서비스에 바인딩하려고 할 때 호출됨. 아직 서비스가 생성되지 않으면 onCreate가 먼저 호출됨)


1. 로컬 서비스

서비스와 이를 생성한 서비스 클라이언트(액티비티)가 동일한 프로세스면 로컬 서비스 

로컬 서비스는 자신을 생성한 어플리케이션 내에서만 사용 가능. 종료되면 같이 종료

1. bindService (C) 

로컬 서비스 연결 요청 

2. onBind (S)

서비스와 통신하기 위한 LocalBinder 객체 반환 

3. onServiceConnected(ComponentName, IBinder)   (C)

LocalBinder 객체의 getService 호출

4. LocalBinder (S)

LocalService 객체의 레퍼런스 반환 

4. mBoundService (C)

LocalService  객체 연결 



2. 원격 서비스 

서비스와 이를 생성한 서비스 클라이언트(액티비티)가 다른 프로세스면 로컬 서비스

액티비티와 자신이 모두 별개의 프로세스에서 동작하므로 IPC 매커니즘을 이용해야 함 

서로 데이터를 주고 받을 때 AIDL(Android Interface Definition Language)를 사용 

1. bindService (C)

RemoteService 연결 요청

2. onBind (S)

Binder 객체 제공

3. onServiceConnected(ComponentName, IBinder) (C)

Binder 객체 이용하여 서비스 프록시 객체 생성

4. mSecondaryService로 리모트 서비스의 메소드 사용


두 서비스의 가장 큰 차이는 서비스 제어를 위한 바인딩 방법

Manifest 파일에서 service 선언 방법이 서로 다름

<service android:name=".app.remoteService" android:process=":remote">

android:process를 작성하면 다른 프로세스로 실행한다.