본문 바로가기

스마트폰/Android

[Android]안드로이드 서비스(Service) 구현. / 1부


오랜만의 포스팅입니다.
요즘 안드로이드와 아이폰을 넘나들며 공부하다가, 이젠 슬슬 정리를 해가며  공부해야겠다는 생각이 들어 포스팅을 하게 되었습니다.


첫 번째로 말씀드릴 개념은 서비스(Service) 입니다.
저는 처음 서비스를 접했을 땐 그저 쓰레드와 같이 생각했었습니다. 하지만 약간의 차이가 있더군요.


- Thread 

   ○ 명령어를 입력하여 돌아가는 프로그램은 모두 프로세스. 즉, 스레드는 명령어들이 순차        적으로 실행되어 순차적으로 실행되는 명령어들을 하나의 실로 꿸 수 있다 하여 이는
       쓰레드가 되며 명칭은 단일쓰레드라고 합니다.(물론 다중쓰레드 등 더 있지만 자세히
       다루지 않겠습니다.) 
   ○ 쓰레드는 Thread 클래스로부터 상속을 받아 만들 수 있습니다.
   ○ Runnable 인터페이스를 implements 하여 사용할 수 있습니다.
   ○ 위의 두 가지 방법은 모두 run() 이라는 Method를 만들어 주어야 하며 실제 구현하는
       코드가 이에 해당합니다.
   ○ 쓰레드를 실행시키기 위해서 start() Method를 호출해야 하며 실행을 종료할 시에는
       run() Method 루틴이 끝나거나 stop() Method를 호출하면 됩니다.


- Service

   ○ Application이 시스템에게 어떤 작업을 Background로 실행하기를 원한다고 알리는
       기능 ( 뒤에서 다루겠지만..  Context.startService() 로 시작할 수 있습니다.)
   ○ 다른 Application에게 서비스의 기능을 노출하기 위해 사용되는 기능
       (Context.bindService() 함수 호출로 이루어집니다. 어플 간 상호작용을 하기 위함이
       죠.)
   ○ Service는 별도의 프로세스가 아닙니다.
       Service는 애플리케이션이 실행되는 프로세스에서 동작합니다.
   ○ Service는 Thread가 아닙니다. 즉, Main Thread와 별개의 작업을 처리하기위해
       만들어진 것이 아니라는 거죠. 예를들면 Application 응답에러를 회피하기 위한 용도로
       사용한다거나 하는.. 그런것들..? 


More...(Service)

안드로이드의 Service는 윈도우나 다른 운영체제 플랫폼의 서비스와 비슷한 개념을 가지고 있습니다. Service는 백그라운드 프로세스로서 장시간동안 실행될 수 있습니다.
안드로이드에는 로컬 Service , 원격 Service 로 정의되어 있습니다. 
 
- 로컬 Service는 그 서비스를 호스팅하는 애플리케이션에서만 접속가능한 구성요소입니다.
- 원격 Service는 위의 로컬 Service와는 반대로 해당기기에서 실행되는 다른 애플리케이션에서    원격으로 접속이 가능한 서비스 입니다. 

새 메시지를 Polling(폴링)하는 이메일 Application에 의해 사용되는 컴포넌트가  서비스의 한 예입니다. 
이런 종류의 서비스는 같은 기기의 다른 Application에서 사용되지 않을 경우 로컬서비스
여러 Application에서 사용된다면 원격서비스로 구현되었을 것입니다.
즉, startService() 인지 bindService() 인지의 차이가 되겠습니다.


먼저 간단한 서비스는 아래 예제와 같습니다.

- 처음 프로젝트를 만들면 Activity 파일만 있죠?


해당 패키지에 Class 파일을 하나 만들어줍니다. ( ex. Background.java)
그리고 Service를 extends 해줍니다. 에러를 없애다보면 아래 패키지들이 import 되어있습니다.

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

..... 생략

.....생략
public class Background extends Service
{
	@Override
	public void onCreate()
	{
		Log.d("TAG Here", "onCreate");
		super.onCreate();
	}
	@Override
	public IBinder onBind(Intent arg0)
	{
		Log.d("TAG Here", "onBind");
		return null;
	}
}


또 하나의 작업이 남아있는데  AndroidManifest.xml 에 서비스 정의 엔트리를 넣어주어야 합니다.




    

    
        
            
                

                
            
        
    
    


자, 이제 서비스를 사용하기 위한 기본이 갖추어졌습니다. (물론 Log.d 는 결과를 보기 위함으로 신경쓰지 않으셔도 됩니다.)

다 작성하고 나셔서 "이 서비스를 어떻게 호출하고 사용하지..?" 라고 생각해보세요.

잠시 생각해보셨으면 일단 그 생각은 접어두시고.. 서비스의 공개 메서드들에 대해 파헤쳐봅시다. 어떤 메서드가 어떤 역할을 하는지 대충 알고 있으면 도움이 됩니다.(도움이 되더라구요)

 Application getApplication();  서비스가 구현된 애플리케이션을 반환
 abstract  IBinder  onBind(Intent intent)  같은 기기에서 실행중인 다른 애플리케이션을
 위한 인터페이스가 들어있음 
 void  onConfigurationChanged(Configuration new Config);  기기 설정이 변경됐을 때 서비스가 스스로
 재구성되게 함 
 void onCreate();  onStart() 가 호출되기 전 서비스가 최초로 생성될 때 한번만 onCreate()를 호출함 
 void onDestrot();  서비스가 종료되기 전에 최종 정리 작업을
 수행하는 메커니즘이 들어있음 
 void onLowMemory();  시스템 리소스가 부족할 때 애플리케이션이 추가로 메모리를 해제할 수 있는 기회를 줌 
 void onRebind();  onBind() 와 onUnbind() 사이에서 호출
 void onStart();  onCreate() 가 호출된 후에 onStart()가 호출 
 boolean onUnbind();  
 final void
 setForeground(boolean isForeground) 
 True/False로 백그라운드, 포그라운드 옵션 설정 가능
 final void stopSelf();  서비스의 종료( Context.stopService())
 final void stopSelf(int startId);  해당 ID 서비스의 종료
 final boolean stopSelfResult(int startId)   서비스의 종료


그리고 서비스의 생명주기 입니다.

 ● 로컬서비스(Local Service) 

startService()
onCreate()
onStop()
onResume()
Service 실행
서비스 중단
onDestroy()
서비스 종료

 ● 원격서비스(Remote Service) 

bindService()
onCreate()
onBind()
클라이언트, 서비스와 상호작용
onUnBine()
onDestroy()
서비스 종료 

 



일단.. 이번 포스팅은 이것으로 끝내구요 2부에는 로컬서비스와 원격서비스의 예제를 설명하고 이해하는 글을 올리도록 하겠습니다.
아직 어떻게 호출해야하는가는 생각하고 계셔야 합니다..ㅎㅎ


From. 박스튜