2 조곽철용이현우김지혜
service 설명 Binder 설명 Service 에 Activity Binding Background 작업자 Thread 이용 예제 참고사이트 1
Service = Deamon = Background Program Ex) 휴대폰에문자를보내면서배경음악이나온다면문자를보내기위해사용자에게제공되는 Activity 이외에보이지않지만 MediaPlayer 가음악을재생 ->android 의 service 2
background 에서실행 비활성 Activity 보다더높은우선순위우선순위활성프로세스 > 화면에보이는프로세스 > 시작된서비스프로세스 > 백그라운드프로세스 > 빈프로세스 사용자입력에직접의존하지않는동작을규칙적이며연속적으로수행에용이 ex)alarm 을사용해, 주기적으로서버정보전송 서비스의시작과종료는다른애플리케이션 ( 다른 Service, Activity, broad cast 수신자를포함 ) 으로부터가능 3
서비스활용사례 별도의 Thread 를통해서사용가능 - 파일다운로드 -Media Player 안드로이드소프트웨어스택내의서비스사용 -Location Manger -Media Controllier -Alarm Manager 4
Service 와 Binding 의서비스생명주기 5
인텐트오브젝트받을수있는시점 Service is started by startservice() Service is created by bindservice() oncreate() oncreate() Active Entire Life time Life time Oncreate()-onDestroy() onstop() 메쏘드는없다. onstart() Service is running The service is stoped(no callback) onbind() Client interacts with the service onunbind() onrebind() ondestroy() ondestroy() Service is shut down Service is shut down 6
두생명주기가서로분리된것이아님 Ex) Background 에뮤직서비스 startservice() 호출에의해시작 -> 제어하거나재생중인음악정보 bindservice() 를호출 ->Activity 가그 Service 에대한커넥션생성가능 이경우, stopservice() 는마지막바인딩이닫힐때까지그서비스를유지 7
서비스생성및제어 Activity Service MyService class 를만들어, 서비스를상속 MyService 에 oncreate(), onstart() 메소드제정의 Mainfest 에새로만든 Service 등록 MyController startservice() stopservice() MyService oncreate() onstart() ondestroy() Mycontroller class 에서 startservice() 를통해 MyService 시작. 한번생성된서비스를다시실행할때는 onstart() 실행 여러번시작한서비스라도 stopservice() 로한번만에종료 8
암시적서비스실행 startservice(new Intent(MyService.MY_ACTION); 명시적서비스실행 startservice(new Intent(this, MyService.class); MyService class 에 MY_ACTION 을포함 Intent 필더에 MY_ACTION 을공급자로등록해야함 9
서비스명을통한서비스종료 ComponentName service = startservice(new Intent(this, M yservice.class); stopservice(new Intent(this, servic e.getclass()); 명시적서비스종료 try{ Class serviceclass = Class.forName(service.getClas sname()); stopservice(new Intent(this, service Class); }catch(classnotfoundexception e){} stopself() or stopselfresult(): 서비스스스로종료하기 (Activity 의 finish() 와동급 ) 10
Linux Kernel 에있는 Binder 를통해관리 11
Binder 란? Application 과 Services 들이서로다른프로세스에서실행중인경우, 프로세서간의통신및데이터공유의관련문제가발생 -> 이때 IPC 를통해프로세스간통신 ( 필연적으로 IPC 통신의경우, 시스템오버헤드및보안관련문제를야기할수있는가능성이항상존재 ) 12
Binder 란? Android Binder 는 IPC 통신을제공하는프로토콜 - 공유메모리를통한성능향상, 프로세서마다요청처리를위한스레드풀 - 오브젝트맵핑과레퍼런스카운팅기능제공 - 바인더를통해 IPC 가이루어질때는기본적으로는동기방식 - 요청한프로세서는요청결과를얻을때까지대기상태 13
ServiceManager->BinderDriver에대한 special Node 0 로동작 ServiceProvider-> 자신의 RPC에대한 Interface를 ServiceManager proxy object에대한 Interface를통해등록 - 이과정을통해 BinderDriver에서는 ServiceProvider로의 path 를생성 Service User-> 사용하려는 Service에대한 Interface를생성위해 ServiceManager에게 RPC call을통해요청 ServiceManager-> Bind되어있는 Object들의목록에서해당하는 ServiceProvider에대한 Node를요청한 ServiceUser에게 return ServiceUser-> return된 Node정보를통해해당 Service Provider 로의 RPC를수행 인용 ) http://andstudy.springnote.com/pages/4314107 / 수원안드로이드플랫폼스터디 14
Service 에서 Binder 를사용하는이유 Activity 가 service 에 Binding 되면, 그 Activity 는해당서비스인스턴스자체에대한레퍼런스를유지. 실행중에서비스에대해메서드를호출가능 15
Service 에서 Binder 를사용하는이유 Service 가 Binding 된후, Service 가가지고있는모든 public 메서드와프로퍼티는 onserviceconnected 핸들러를통해서얻어진 servicebinder 객체를통해서이용가능 16
Service 에서 Binder 를사용하는이유 일반 Service 는 Client 가서비스의동작을알지못하게은밀히동작그러나 Binding 된 Service 는 Activity 가상태를파악하고제어 17
Service 에서 Binder 를사용하는이유 Broadcast 인텐트또는 Service 시작시사용되는인텐스익스트라번들을이용해서간단히다른프로세스로실행중인서비스와간단히통신가능 좀더단단히결합된연결을원할경우에는 AIDL 이용 18
서비스작성순서 Activity MyController bindservice() unbindservice() 4 Service MyService oncreate() onbind() 2 ServiceConnection onserviceconnected() onservicedisconnected() 3 Binder 1 MyBinder getstatus():myservice 19
서비스동작 Activity MyController bindservice() unbindservice() ServiceConnection onserviceconnected() onservicedisconnected() 3.Linstener 인 ServiceConnection 의 onserviceconnected 호출 1. 호출 Service MyService oncreate() onbind() 2.IBinder 타입인 MYBinder 객체생성 Binder linux 20
Process thread thread Process Service ~.apk Activity DVM DVM Task Process ~.apk Activity DVM thread 21
백그라운드의 thread 의필요성모든콤포넌트는하나의 Main thread 위에서동작 -> 시간이많이걸리는작업시, 화면에보이는 Activity 외에다른모든콤포넌트호출 -> "Application Unresponsive" 메시지가출력 느리고시간이많이드는작업으로 Main thread 에서 child thread 로옮기는것을추천 22
Application Unresponsive Error 란? - 안드로이드는 Activity 관리자, 윈도우관리자를통해반응. 이두서비스중하나가반응이느린애플리케이션을감지시애플리케이션의반응이느림을알리는 AUR 에러메시지출력 - 에러는모달 (modal) 로, 포커스를빼앗으며사용자가버턴누르거나애플리케이션이반응하기시작할때까지대기 23
추천하는백그라운드 thread 활용 - 키누른후, 입력에대해서 5 초이내에무반응 -Broadcast Receiver 가 onreceive Handler 를 10 초이내에완료불가시 24
문제를일으키는주요원인이되는작업 - 파일작업 - 네트워크조회 - 데이터베이스트랜잭션 - 복잡한계산 25
새로운 thread 와 GUI 작업을위한 thread 동기화 Foreground Main Thread mainprocessing() Thread Background Child Thread backgroundthread Processing() updategui() Handler Handler.post(..) 26
- 골격코드 // GUI Handler 처리.. private Handler handler = new Handler(); // 이메서드는메인 GUI 스레드에서호출 private void mainprocessing(){ // 이는시간이많이드는작업을자식스레드로옮김 Thread thread = new Thread(null, dobackgroundthreadprocessing, "Background"); thread.start(); } // 백그라운드처리메서드를실행하는 Runnable private Runnable dobackgroundthreadprocessing = new Runnable(){ @Override public void run() { backgroundthreadprocessing(); } }; // 백그라운드에서몇가지처리를수행하는메서드 private void backgroundthreadprocessing(){ //[ 필요한코드 ] // 처리가끝나고결과를 UI로출력을해야할때아래핸들러를추가해서사용 handler.post(doupdategui); } // GUI 업데이트메서드를실행하는 Runnable private Runnable doupdategui = new Runnable(){ @Override public void run() { updategui(); } }; private void updategui() { // [[ 필요한 UI 코드 ]] 27
Thread 를만드는핵심코드 private void mainprocessing(){ Thread thread = new Thread(null, dobackgroundthreadprocessing, "Background"); thread.start(); } -> Thread(ThreadGroup group, Runnable runnable, String threadname) 28
Thread 와 GUI 연결을위한핵심코드 handler.post(doupdategui); ->post(runnable r) Handler 를사용하는이유모든 GUI 는 Main thread 가가지고, Child Thread 는 GUI 가없음 View, Toast 등은모두 Main thread 에서처리해야됨따라서 handler 를통해서 child thread 의처리결과를 Main thread 에서처리가능 29
Handler 클래스의추가메소드 -pastdelayed: 포스팅을늦추어처리 -pastattime : 포스팅을특정시간에실행 UIThreadUtilities 클래스이클래스는 runonuithread 를갖고있어서 View, Activity, Dialog 와같은 thread 에서메소드를강제적으로실행 30
Thread 에서꼭기억해야할사항 애플리케이션컴포넌트에서알림과인텐트는항상 GUI Thread 에서수신되고처리 다른모든경우에있어, GUI Thread 에서생성된객체와명시적으로상호작용하거나메시지를표시하는작업은 MainThread 서띄워져야만함 31
Media Player 32
화면없이뒤에서실행되는기능 현재사용자가화면 (Activity) 를보고있지않아도 Background 에서실행되는 Service 로 문자를보내거나, 다른작업중에도음악이재생 33
새프로젝트생성 34
안드로이드프로젝트생성 35
프로젝트 name 입력 36
가상머신설정 37
패키지네임입력 38
Package Explorer 에새패키지가생성된것을확인 39
Main.xml 에버튼생성 40
버튼이름및텍스트수정 41
수정상황확인 42
MusicplayerAct ivity.java 의소스코드입력. Play 버튼과 Stop 버튼클릭시효과설정 43
새 class 생성 44
ServiceClass 생성 45
생성된모습 46
사용할것들을 import 47
소스코드입력 Rec 폴더의 raw 폴더내 music.mp3 파일재생및정지설정 48
오류발생 49
해결방법 Rec 폴더에 File->New- >Folder 로 raw 폴더생성후, mp3 파일을드래그해서입력 R.java 이자동인식을못함으로발생되는듯 50
Manifes 수정 Serviceclass 를지정 51
컴파일 52
실행확인 Home 이나 backkey 를눌러화면이전환되어도재생가능 53
안드로이드사이드 - 강좌 / 학습 http://www.androidside.com/plugin/mobile/board.php?bo_table=b 46&wr_id=13275&sca=%EC%9A%A9%EC%96%B4%EC%A0%95%EB%A6% AC [PAAD 08 장 ] 백그라운드에서작업하기 http://www.androidpub.com/102370 안드로이드 (Android)& 이 - 파리 (e-passport Lead) 란? http://blog.naver.com/menusys?redirect=log&logno=112936893 Android service 만들어보기예제 http://blog.naver.com/postview.nhn?blogid=rosaria1113&logno=9 3035557&redirect=Dlog&widgetTypeCall=true 아마추어역학인 raw cannot be resolved or is not a field error 해결 http://blog.naver.com/asiakth?redirect=log&logno=11013474227 5 54