본문 바로가기

Daily Sample

[Day21] Service와 Broadcast 로 실행되는 Androday pedometer App 소스

TITLE : Androday pedometer App 

Date : 2010/08/24 

Description : 

This is Source that Androday pedometer App by excuting Service & Broadcast

Download Link : 

Reference Site : http://pulsebeat.tistory.com/44 , http://android-town.org 

안드로이드폰이 아이폰보다 가질수 있는 강점이 무었일까. . 

기술적인 측면에서 본다면 세그먼트 단위로 돌아가는 달빅프로세서 라고 생각한다. 

이렇게 구성한 이유는 백그라운드 서비스를 고려한 조치라고 생각한다. 

비록, 현재는 이 구조때문에 퍼포먼스나 안정성 측면에서 안드로이드가 욕을 먹고있지만, 후세에 빛날거라 생각한다. 

사설이 길었지만, 서비스와 브로드캐스트 를 이용하면 다중프로세서를 지원하는 윈도우 프로그램처럼 실행할 수 있다. 

서비스는 쉽게 말하면 메인스레드에서 동작하는 UI가 없는 Activity이다. 

UI가 없으므로 OnReusume()과 OnPause() 가 없고 라이프 사이클은 다음과 같다. 

메인스레드에서 관리하기때문에 UI가 종료되도 살아서 서비스를 계속한다.

 
Broadcast는 말그대로 방송이다. 컴퓨터 통신을 전공한 사람은 좀더 쉽게 이해할 수 있는데

라우터는 브로트캐스트 메세지를 전체에 날리고 거기에 해당하는 클라이언트가 응답하는 형태인 것이다. 

안드로이드 OS는 구내방송을 하고 App은 자신에게 해당하는 메세지면 onReceive()에서 작동하는 것이 Broadcaste Receiver의 원리이다.  

 
오늘은 Service와 BroadCaste reciver를 이용한 Androday 만보기 App을 만들어 본다. 

 1. 시작버튼을 누르게되면 Sevice를 상속받는 myServiceItent를 실행시킨고 방송을 들을 준비를 마친 Broadcaste Receiver를 등록시킨다. 

IntentFilter mainFilter = new IntentFilter(“com.androday.test.step”);       
//인텐드 필터 (예: SBS 방송) 

registerReceiver(receiver, mainFilter); 

//Broadcaste Receiver 등록
      
      startService(intentMyService);  

//서비스 시작    

 

2. 서비스가 실행되면 onStart()에서 센서 리스너를 등록하여 센서에 반응할 준비를 한다. 

센서값이 변경되면 . SensorEventListener클래스의 onSensorChanged(SensorEvent event)를 오버라이드해서 센서값을 가져올 수 있다.  

센서부분은 본인이 짠게 아니고 제스쳐 기능을 구현한 외쿡분께서 고안한 알고리즘 이기때문에 별도로 질문하시길; 

        if (accelerormeterSensor != null)
            sensorManager.registerListener(this, accelerormeterSensor,
                    SensorManager.SENSOR_DELAY_GAME);  

 
3. 홈화면으로 이동해도 센서는 작동하기 때문에 지속적으로 변경된 값이 저장되는데 이때 Static 변수를 잡아서 걸음수를 저장하면, 

멈추거나 다시 화면으로 돌아왔을 때 Static변수를 호출해서 사용하면 최신의 걸음수를 표시할 수 있다.  

 
4. 센서값이 변경되면 myServiceItent의 onSensorChanged(SensorEvent event)에서 registerReceiver함수를 사용하여 

방송을 송출하게 되는데 MainActivity에서는 BroadcastReceiver를 생성하고 등록하여 귀기울여 듣고 있어야 한다. 

<myServiceItent 방송 송출 부분> 

IntentFilter mainFilter = new IntentFilter(“com.androday.test.step”);       
           
      registerReceiver(receiver, mainFilter);  

<MainActivity 방송 듣는 부분> 

 class MyMainLocalRecever extends BroadcastReceiver { 

     @Override
     public void onReceive(Context context, Intent intent) 


<P.S> 구현된 만보기는 사실 완전한 App이 아니다. 대기모드에 들어갈 경우 서비스도 중지되어서 카운터하지 않는데,  걸음을 카운터할 때 마다 시스템을 깨우는 프로세서가 필요할 것으로 보인다.  

Creative Commons License
이 저작물은 크리에이티브 커먼즈 저작자표시 3.0 Unported 라이선스에 따라 이용할 수 있습니다.