본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android/안드로이드] 죽지 않는 service 만들기 ( 사실은.. 지속적인 부활 )

by 돼지왕 왕돼지 2012. 2. 7.
반응형

안녕하세요 돼지왕왕돼지입니다.
이번에는 죽지 않는 서비스 만드는 방법을 함께 알아볼까 합니다.
사실 죽지 않는 서비스는 만들지 않는 것이 좋습니다.

대부분 Service 가 죽는 경우는 안드로이드 단말 자체의 메모리가 부족하여 Framework 가 강제로 kill 하거나,
아니면 Fatal Exception이 있어 죽는 경우인데
죽지 않는 서비스를 만들어 죽는 서비스를 계속해서 살려 버린다면..
메모리 문제는 해결되지 않고, Fatal Exception의 경우 계속해서 발생하겠죠..

따라서 죽지 않는 서비스를 만들 때에는 반드시
 

"이 서비스가 "무조건" 살아 있어야만 하는가?"

 
 에 대해 다시 한번 생각하고 만드시길 바랍니다.

죽지 않는 서비스는 "Alarm Service" 를 이용하여 구현하면 쉽습니다.
onDestory 가 호출될 때 Service 를 호출하는 alarm 을 alarm service에게 전달하는 방식입니다.






PersistentService.java

class PersistentService extends Service {
  onCreate(..) {
    unregisterRestartAlarm(); //이미 등록된 알람이 있으면 제거
  }

  onDestroy(..) {
    registerRestartAlarm(); // 서비스가 죽을때 알람을 등록
  }
 
  void registerRestartAlarm() {
    Intent intent = new Intent( PersistentService.this, RestartService.class );
    PendingIntent sender = PendingIntent.getService( PersistentService.this, 0, intent, 0 );
    long firstTime = SystemClock.elapsedRealtime();
    firstTime += 10*1000; // 10초 후에 알람이벤트 발생
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 10*1000, sender);
  }

  void unregisterRestartAlarm() {
    Intent intent = new Intent(PersistentService.this, RestartService.class);
    PendingIntent sender = PendingIntent.getService( PersistentService.this, 0, intent, 0 );
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
    am.cancel(sender);
  }
}

 
이상입니다~




반응형

댓글