Start Service at Boot Time

안드로이드 폰은 부팅이 끝나면 액션이 ‘android.intent.action.BOOT_COMPLETED’인 인텐트를 브로드캐스트 한다. 그러므로 이 인텐트 브로트캐스트를 받을 수 있는 BroadcastReceiver가 필요하다.

public class GPSLoggerServiceManager extends BroadcastReceiver {
  public void onReceive(Context ctx, Intent intent) {
   if (intent.getAction().equals(“android.intent.action.BOOT_COMPLETED”)) {
     ComponentName cName = new ComponentName(ctx.getPackageName(), GPSLogger);
     ComponentName svcName = ctx.startService(new Intent().setComponent(cName);
     if (svc == null) {
       Log.e(TAG, “Could not start service ” + cName.toString());
   } else {
     Log.e(TAG, “Received unexpected intent ” + intent.toString());

여기서 가장 핵심은 onReceive() 메소드이다. 원하는 인텐트가 브로드캐스트 되면 onReceive() 메소드가 호출된다.

그리고 리시버는 manifest 파일에 선언되어 있어야 한다.

<receiver android:name=”.LocationLoggerServiceManager
   android:label=”LocationLoggerServiceManager” >
   <action android:name=”android.intent.action.BOOT_COMPLETED” />

또한 이 클래스는 보안 설정에 선언할 필요가 있는 특정 이벤트 브로드캐스트를 들어야 하기 때문에 manifest 파일에 RECEIVE_BOOT_COMPLETED 퍼미션이 있어야 한다.

<uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” />

위와 같이 추가해주면 부팅이 끝나고 서비스가 자동으로 실행되게 된다.

On current Android devices, we can keep only a small handful of applications
running at the same time.  Having your application do this is going to going
to take resources from other things that at any particular point in time
would be better used elsewhere.  And in fact, you can be guaranteed that
your service will -not- stay running all of the time, because there is so
much other stuff that wants to run (other background services that are only
running when needed will be prioritized over yours), or needs more memory
for what the user is actually doing (running the web browser on complicated
web pages is a great way to kick background stuff out of memory).

We have lots of facilities for implementing applications so they don’t need
to do this, such as alarms, and various broadcasts from events going on in
the system.  Please please please use them if at all possible.  Having a
service run forever is pretty close to the side of evil.

지나치게 긴 작업의 경우 작업도중 죽게 된다고하네요. 이럴경우 쓰레드로 빼서 구현해야 될것 같네요..

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.