Android Service Team 4 20100031 강혜주 20100220 김소라 20100357 김진용
Contents Android Service 01 안드로이드서비스 02 사용이유 03 안드로이드서비스예 04 안드로이드서비스분류 Application Service 05 애플리케이션서비스 06 두가지방법 07 서비스생명주기 08 애플리케이션서비스분류 09 마샬링 / 언마샬링 10 로컬서비스 11 리모트서비스 12 로컬서비스 & 리모트서비스생성 System Service 13 안드로이드시스템서비스 14 네이티브시스템서비스 15 자바시스템서비스 16 자바시스템시스템서비스서비스실행과정 17 시스템서비스동작과정 18 서비스예제코드
Android Service 01 안드로이드서비스 UI 없이주기적으로특정한일을수행하는백그라운드프로세스를가리킴 클라이언트를위해특정한기능을제공하는역할
Android Service 02 사용이유 Activity 가종료되어도계속해서동작하게하기위하여사용 애플리케이션개발에필요한중요 API 를시스템서비스로지원
Android Service 03 서비스예
Android Service 04 안드로이드서비스분류 코어플랫폼서비스 자바시스템서비스 시스템서비스 하드웨어서비스 안드로이드서비스 네이티브시스템서비스 로컬서비스 애플리케이션서비스 원격서비스
Application Service 05 애플리케이션서비스 안드로이드 SDK 의 Service 클래스를확장한클래스의인스턴스 UI 없이주기적으로특정한일을수행하는 백그라운드프로세스를가리킴 Activity 나 Broadcast Receiver 처럼안드로이드애플리케이션컴포넌트의일종
Application Service 06 개발자가서비스이용방법 1. 서비스시작종료 각종기능을수행하는서비스를백그라운드로 실행 / 종료 2. 바인딩을통한서비스원격제어 바인딩이유지되는동안서비스가제공하는인터페이스를통해서비스의각종기능을제어가능
Application Service 07 애플리케이션서비스생명주기 startservice() Api 를통한서비스시작 bindservice() Api 를통한서비스생성 oncreate() onstartcommand() 서비스실행서비스중단 ondestroy() oncreate() onbind() 클라이언트와서비스의상호작용 onunbind() ondestroy() ondestroy() 서비스종료 서비스종료
Application Service 07 애플리케이션서비스생명주기 oncreate onstartcommand onbind 백그라운드데몬일경우 ondestroy 원격인터페이스호출인경우
Application Service 08 애플리케이션서비스의분류 프로세스 액티비티 액티비티 생성 생성 로컬서비스 프로세스 APK 패키지 리모트서비스 프로세스 APK 패키지
Application Service 08 애플리케이션서비스의분류 1. 로컬서비스 서비스를생성했을때서비스가자신과동일한 프로세스에서실행 메인액티비티가종료되면같이종료됨 바인딩할로컬서비스의레퍼런스만얻으면됨
Application Service 08 애플리케이션서비스의분류 2. 리모트서비스 서비스를생성했을때서비스가자신과다른 프로세스에서실행 메인액티비티가종료하더라도계속동작 독립적인프로세스위에서서로동작하기때문에 IPC 메커니즘을이용 바인더 IPC 통신을해야하므로마샬링 / 언마샬링 과정을거쳐야함
Application Service 09 마샬링 / 언마샬링 마샬링 : 데이터를모은다음, 데이터들을메시지형식으로버퍼에넣고인터페이스에맞게데이터를조직화하거나미리정해진 형식으로변환하는과정 언마샬링 : 마샬링을통해서보내진데이터들을원래구조로복원시키는것
Application Service 10 로컬서비스 동일프로세스영역 서비스클라이언트 로컬서비스 액티비티 mboundservice 서비스 bindservice() mbinder onbind() ServiceConnection onserviceconnected( ComponentName, IBinder LocalBinder getservice()
Application Service 10 로컬서비스 액티비티 동일프로세스영역 (1) bindservice(intent,serviceconnection,int) 를호출하여서비스에게연서비스클라이언트로컬서비스결요청 mboundservice 서비스 bindservice() mbinder onbind() ServiceConnection onserviceconnected( ComponentName, IBinder LocalBinder getservice()
Application Service 10 로컬서비스 액티비티 동일프로세스영역 (1) bindservice(intent,serviceconnection,int) (2) 바인딩처리를위한서비스의 onbind(intent) 를호출하여메서드서비스에게호출연서비스클라이언트로컬서비스 ( 액티비티가자신과연결할결수요청있게 Binder객체를반환 ) mboundservice 서비스 bindservice() mbinder onbind() ServiceConnection onserviceconnected( ComponentName, IBinder LocalBinder getservice()
Application Service 10 로컬서비스 액티비티 동일프로세스영역 (1) (3) bindservice(intent,serviceconnection,int) onserviceconnected(componentname,ibinder) (2) 바인딩처리를위한서비스의 onbind(intent) 를호출하여메서드서비스에게바인더호출객체의연서비스클라이언트로컬서비스 ( 액티비티가 getservice() 자신과를호출하여연결할서비스결수요청있게객체의 Binder 레퍼런스객체를값을반환구함 ) mboundservice 서비스 bindservice() mbinder onbind() ServiceConnection onserviceconnected( ComponentName, IBinder LocalBinder getservice()
Application Service 10 로컬서비스 액티비티 동일프로세스영역 (1) (4) (3) bindservice(intent,serviceconnection,int) 서비스 onserviceconnected(componentname,ibinder) (2) 바인딩객체의처리를레퍼런스위한값을서비스의액티비티의 onbind(intent) mbundservice 를호출하여메서드서비스에게바인더멤버호출객체의필드에연서비스클라이언트로컬서비스 ( 액티비티가 getservice() 자신과를호출하여연결할서비스저장결수요청있게객체의 Binder 레퍼런스객체를값을반환구함 ) mboundservice (4)LocalService 객체연결 서비스 bindservice() mbinder onbind() ServiceConnection onserviceconnected( ComponentName, IBinder LocalBinder getservice()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) 액티비티 mservice 서비스 bindservice() msecondarybinder ServiceConnection onbind() onserviceconnected( ComponentName,IBinder ISecondary.Stub Isecondary.Stub.Proxy getpid() 프록시메서드 Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) 액티비티 mservice 서비스 bindservice() msecondarybinder ServiceConnection onbind() onserviceconnected( ComponentName,IBinder ISecondary.Stub Isecondary.Stub.Proxy getpid() 프록시메서드 Isecondary.aidl getpid() 스텁메서드 ontransact() 액티비티와서비스의통신을위한인터페이스정의 aidl 틀에의해자동생성 ISecondary.aidl
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) bindservice(intent,serviceconnection,int) 를호출하여서비스에게연액티비티결요청 mservice 서비스 bindservice() msecondarybinder ServiceConnection onbind() onserviceconnected( ComponentName,IBinder ISecondary.Stub Isecondary.Stub.Proxy getpid() 프록시메서드 Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) bindservice(intent,serviceconnection,int) (2) 서비스의 onbind(intent) 를호출하여를바인더호출하여객체서비스에게제공연 ( 액티비티여기서바인더객체는결 Stub 요청클래스를통해생성됨 ) mservice 서비스 bindservice() msecondarybinder ServiceConnection onbind() onserviceconnected( ComponentName,IBinder ISecondary.Stub Isecondary.Stub.Proxy getpid() 프록시메서드 Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) bindservice(intent,serviceconnection,int) (2) 서비스의 onbind(intent) 를호출하여를바인더호출하여객체서비스에게제공연 (3) 서비스와바인더 IPC를수행하기위한프록시객체생성 ( 액티비티여기서바인더객체는결 Stub 요청클래스를통해생성됨 ) mservice 서비스 bindservice() msecondarybinder ServiceConnection onbind() onserviceconnected( ComponentName,IBinder Isecondary.Stub.Proxy getpid() 프록시메서드 (3)Binder 객체이용서비스프록시객체생성 Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl ISecondary.Stub getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) bindservice(intent,serviceconnection,int) (2) 서비스의 onbind(intent) 를호출하여를바인더호출하여객체서비스에게제공연 (4) 서비스 (3) 서비스와프록시객체를바인더이용해서 IPC를수행하기서비스의위한서비스프록시프록시객체메서드생성호출 ( 액티비티여기서바인더객체는결 Stub 요청클래스를통해생성됨 ) mservice 서비스 bindservice() (4)getPid() 프록시함수호출 ServiceConnection msecondarybinder onbind() onserviceconnected( ComponentName,IBinder Isecondary.Stub.Proxy getpid() 프록시메서드 (3)Binder 객체이용서비스프록시객체생성 Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl ISecondary.Stub getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) (4) (5) bindservice(intent,serviceconnection,int) 서비스서비스 (2) 서비스의프록시프록시객체를객체 onbind(intent) (Proxy) 이용해서에서를서비스의서비스호출하여바인더서비스를바인더호출하여객체프록시객체 (Stub) 서비스에게메서드제공로바인더호출연 ( 액티비티여기서바인더객체는 IPC 데이터결 Stub 요청클래스를전달통해생성됨 ) mservice 서비스 bindservice() (4)getPid() 프록시함수호출 ServiceConnection msecondarybinder onbind() onserviceconnected( ComponentName,IBinder Isecondary.Stub.Proxy getpid() 프록시메서드 (3)Binder 객체이용서비스프록시객체생성 (5) 바인더 IPC 데이터 (TRANSACTION_getPid 트랜잭션코드 ) Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl ISecondary.Stub getpid() 스텁메서드 ontransact()
Application Service 11 리모트서비스 액티비티 (Process A) 리모트서비스 (Process B) (1) bindservice(intent,serviceconnection,int) (2) 서비스의 onbind(intent) 를호출하여를바인더호출하여객체서비스에게제공연 (4) (5) 서비스서비스 (3) 서비스와프록시프록시객체를객체 (6) 바인더 (Proxy) 서비스의이용해서 IPC를에서 Stub 수행하기서비스의서비스메서드를위한바인더서비스호출프록시객체프록시 (Stub) 객체메서드생성로바인더호출 ( 액티비티여기서바인더객체는 IPC 데이터결 Stub 요청클래스를전달통해생성됨 ) mservice 서비스 bindservice() (4)getPid() 프록시함수호출 ServiceConnection msecondarybinder onbind() onserviceconnected( ComponentName,IBinder Isecondary.Stub.Proxy getpid() 프록시메서드 (3)Binder 객체이용서비스프록시객체생성 (5) 바인더 IPC 데이터 (TRANSACTION_getPid 트랜잭션코드 ) Isecondary.aidl aidl 틀에의해자동생성 ISecondary.aidl ISecondary.Stub getpid() 스텁메서드 (6)getPid() 스텁메서드호출 ontransact()
Main Subject 12 로컬 & 리모트서비스생성 로컬서비스 : <service> 엘리먼트에서비스이름만추가 리모트서비스 : <service> 엘리먼트에이름뿐만아니라 android:process 애트리뷰트를추가
Main Subject 12 로컬 & 리모트서비스생성
System Service 13 안드로이드시스템서비스 디바이스제어, 위치정보제공, 알람설정및 통지메시지표시등제공 시스템의가장기본적인핵심기능들을제공함
System Service 안드로이드서비스분류 코어플랫폼서비스 자바시스템서비스 시스템서비스 하드웨어서비스 안드로이드서비스 네이티브시스템서비스 로컬서비스 애플리케이션서비스 원격서비스
System Service 13 안드로이드시스템서비스 APPLICATIONS Home Dialer SMS/MMS IM Browser Camera 코어플랫폼 Home 서비스 & 하드웨어서비스 Media Contacts Voice Dial Email Calender Albums Home Player APPLICATION FRAMEWORK Activity Manager Window manager Content Providers View System Notification Manager Package Manager Telephony Manager Resource Manager Location Manager LIBRARIES ANDROID RUNTIME Surface Manager Media Framework SQLite Core Libraries OpenGL ES 네이티브시스템 Package Manager 서비스 WebKit Dalvik Virtual Machine SGL Package Manager Sibc LINUX KERNEL Display Driver Camera Driver Bluetooth Driver Shared Memory Drivers Binder(IPC) Driver USB Driver Keypad Driver WiFi Driver Audio Drivers Power Management
System Service 14 네이티브시스템서비스 App 1 App 2 Tone Audio Music Player Game Audio Audio Flinger Earphone Speaker Bluetooth Java JNI Interface Audio Source Binder Transfer Native service Reasmpilling mixing Audio codes App 1 App 2 Media Player Tone Audio Audio Manager AudioFlinger 이어폰 헤드폰
System Service 14 네이티브시스템서비스 App 1 App 2 Surface Surface Surface Surface Flinger Frame Buffer Java surface Native service FrameBuffer JNI Interface Binder Transfer Compose App 1 Surface Flinger App 2
System Service 15 자바시스템서비스 코어플랫폼서비스 안드로이드애플리케이션과직접상호작용은 하지않지만안드로이드프레임워크가동작하는데필수적인서비스
System Service 15 자바시스템서비스 하드웨어서비스 저수준하드웨어제어를위한 API 를제공하는서비스
System Service 15 자바시스템서비스 getsystemservice() Local Manager 생성 Location Manager 바인더 IPC Location Service 1. 현재 GPS 위치정보요청 2. GPS 정보제공
System Service 16 시스템서비스실행과정 (2) Zygote 실행 Zygote 자바레이어 (5) 자바시스템서비스실행 System Server Activity Service Connectivity Service Location Service Sensor Service Wifi Service 자바시스템서비스 init (1) Media Server 프로세스실행 Media Player Service Audio Flinger Surface Flinger Camera Service Libandroid_servers Media Server 네이티브시스템서비스 C++ 레이어 (4) Surface Flinger 서비스실행
System Service 16 시스템서비스실행과정 서비스를 Context Manager 에등록함 Audio Flinger 서비스등록 서비스등록 main_mediaserver.c pp 의 Main() 함수 Camera Service Media Player Service 서비스등록 Context Manager Audio Policy Service 서비스등록 Media Server 프로세스
System Service 16 시스템서비스실행과정 System Server 프로세스 (SystemServer.java) 자바레이어 (5)ServerThread 생성 Init1() Init2() ServerThread (6) 자바시스템서비스생성및등록 Activity Service Alarm Service Connectivity Service (1)JNI 로 System_init() 호출 (4)JNI 로 Init2() 메서드호출 Location Service System_init() (2) 인스턴스생성 (3) 서비스등록 Surface Flinger Context Manager Libandroid_servers 라이브러리 C++ 레이어
System Service 17 시스템서비스동작구조 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 시스템서비스핸들리스트 서비스프록시 Ifoo 서비스인터페이스 바인더 RPC 서비스프레임워크 서비스매니저 서비스스텁 IServiceManager 서비스인터페이스 addservice() getservice() 바인더 IPC 바인더드라이버
System Service 17 시스템서비스동작구조 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 서비스프록시 Ifoo 서비스인터페이스 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버
System Service 17 시스템서비스동작구 조 (1) 프록시함수를호출해서바인더 RPC 데이터를생성및전달 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버
System Service 17 시스템서비스동작구 조 (2) 서비스프록시함수를통해마샬링이됨 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버
System Service 17 시스템서비스동작구 조 (3) 서비스프레임워크를통해바인더 IPC 데이터로생성 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 IPC 데이터 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버
System Service 17 시스템서비스동작구 조 (4) 바인더 IPC 데이터를바인더드라이버를통해서비스에전송 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 IPC 데이터 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 바인더 IPC 데이터 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버 바인더 IPC
System Service 17 시스템서비스동작구 조 (5) 서비스프레임워크를통해언마샬링됨 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 IPC 데이터 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 서비스스텁 바인더 IPC 데이터 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버 바인더 IPC
System Service 17 시스템서비스동작구 조 (6) RPC 코드를통해알맞은서비스스텁함수를찾음 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 IPC 데이터 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 바인더 RPC 데이터서비스스텁 ontransact() 바인더 IPC 데이터 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버 바인더 IPC
System Service 17 시스템서비스동작구 조 (7) RPC 데이터를인자로해서서비스스텁함수호출 서비스클라이언트서비스서버컨텍스트매니저 서비스사용자 foo() 서비스프록시함수호출 바인더 RPC 데이터 서비스프록시 Ifoo 서비스인터페이스 foo() 서비스프록시함수 바인더 IPC 데이터 RPC 형태로 Foo 서비스의 foo() 함수호출 바인더 RPC 서비스프레임워크 서비스매니저 Foo 서비스 Ifoo Foo() 서비스서비스인터페이스스텁함수 바인더 RPC 데이터서비스스텁 ontransact() 바인더 IPC 데이터 시스템서비스핸들리스트 핸들 RPC 데이터 RPC 코드 바인더프로토콜 IServiceManager 서비스인터페이스 addservice() 바인더 IPC 데이터 getservice() 바인더 IPC 바인더드라이버 바인더 IPC
System Service 18 서비스예제코드 https://github.com/gohomeapp 저장소 ServiceExam 서비스생명주기에관한내용 demonservice 백그라운드로돌아가는서비스에관한내용 bindservice 바인더서비스에관한내용
Q & A