올해는 머신러닝이다.
[펌]죽지않는 서비스 만들기 본문
현재 진행하는 프로젝트를 위해 죽어도 다시 바로 살아날 수 있는 서비스가 필요하여 간단한 서비스가 죽게 되면은 AlarmManager를 이용하여 다시 살아날 수 있는 서비스를 만들어보았다.
시작은 우선 기본적인 서비스 시작과 중지를 담당하는 MainActivity가 있다.(ImmortalServiceMainActivity)
그러면 이제 부터는 소스를 살펴보자.
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 살리기)을 수행
'Android > Tip&Tech' 카테고리의 다른 글
Gallery 리로딩할때 필요한 소스 (0) | 2011.08.31 |
---|---|
[펌]허니컴 관련 추천 사이트 정리 (0) | 2011.08.24 |
안드로이드 AsyncTask 와 Thread 차이 (0) | 2011.08.20 |
[펌][Java/Android] 원격지 이미지 다운로드 (Remote Image Downloader) (0) | 2011.08.11 |
[Android] 물에 반사된 듯한 이미지 효과 만들기. (0) | 2011.08.10 |