«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

올해는 머신러닝이다.

[펌]죽지않는 서비스 만들기 본문

Android/Tip&Tech

[펌]죽지않는 서비스 만들기

행복한 수지아빠 2011. 8. 21. 22:21
출처 : http://karyurid.tistory.com/97

현재 진행하는 프로젝트를 위해 죽어도 다시 바로 살아날 수 있는 서비스가 필요하여 간단한 서비스가 죽게 되면은 AlarmManager를 이용하여 다시 살아날 수 있는 서비스를 만들어보았다.

 

시작은 우선 기본적인 서비스 시작과 중지를 담당하는 MainActivity가 있다.(ImmortalServiceMainActivity)

 

주가되는 것은 PersistentService.java & RestartService.java 두 가지가 있다. 이 두개를 이용하여 서비스가 중지가 되면 AlarmManager를 이용하여 서비스를 다시 실행하게 만들어준다. 위의 것을 사용하기 위해서는 Service의 생명주기를 알아야 한다.


그러면 이제 부터는 소스를 살펴보자.

PersistentService.java

@Override

public void onCreate() {

        // TODO Auto-generated method stub

        Log.d(TAG, "Service Create");

        unregisterRestartAlarm(); //등록된 알람은 제거

        super.onCreate();

}

 

@Override

public void onDestroy() {

        // TODO Auto-generated method stub

        Log.d(TAG, "Service Destroy");

        registerRestartAlarm(); // 서비스가 죽을 때 알람 등록

        super.onDestroy();

}

 

void registerRestartAlarm() {

        Log.d(TAG, "registerRestartAlarm");

        Intent intent = new Intent(PersistentService.this, RestartService.class);

        intent.setAction(RestartService.ACTION_RESTART_PERSISTENTSERVICE);

        PendingIntent sender = PendingIntent.getBroadcast(

                       PersistentService.this, 0, intent, 0); // 브로드케스트할 Intent

        long firstTime = SystemClock.elapsedRealtime();  // 현재 시간

        firstTime += 1 * 1000; // 10초 후에 알람이벤트 발생

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); // 알람 서비스 등록

        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,

                       10 * 1000, sender); // 알람이

}

       

RTC_WAKEUP : 알람 설정 시 지정된 시계 시간에 Intent를 생성하도록 장치를 깨움

RTC : 명시적인 시간에 Intent를 발생시킬 것이지만, 장치를 깨우지는 않음

ELAPSED_REALTIME : 장치가 부팅되고 난 이후로 경과된 시간의 양에 기반해 Intent 발생. 장치를 깨우지는 않음. 절전상태도 포함

ELAPSED_REALTIME_WAKEUP : 장치가 부팅된 이후로 지정된 길이의 시간이 지나면 intent발생 후 필요한 경우 장치를 깨움

 

void unregisterRestartAlarm() {

        Log.d(TAG, "unregisterRestartAlarm");

        Intent intent = new Intent(PersistentService.this, RestartService.class);

        intent.setAction(RestartService.ACTION_RESTART_PERSISTENTSERVICE);

        PendingIntent sender = PendingIntent.getBroadcast(

               PersistentService.this, 0, intent, 0);

        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);

        am.cancel(sender);    

}

 

RestartService.java

@Override

public void onReceive(Context context, Intent intent) {

        //TODO Auto-generated method stub

        Log.d("ImmortalService", "RestartService called!@!@@@@@#$@$@#$@#$@#");

       

        if(intent.getAction().equals(ACTION_RESTART_PERSISTENTSERVICE)) {

               Intent i = new Intent(context, PersistentService.class);

//Intent i = new Intent(this, PersistentService.class);

                context.startService(i);

        }      

}

 

AndroidManifest.xml

<receiver android:name="RestartService" android:process=":remote">

       <intent-filter>

                       <action android:name="ACTION.Restart.PersistentService"></action>

        </intent-filter>

</receiver>



위와 같이 다 코딩을 완료하였으면 최초에 서비스를 실행하고 서비스를 죽일 경우

1.     AlarmManager 등록

2.     정해진 시간이 흐른 뒤 Intent BroadCasting

3.     BroadcastReceiver Broadcast Intent를 받고 미리 정의한 행동(PersistentService 살리기)을 수행