안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요
주기적으로 네트워크 통신을 하는 서비스를 개발중입니다.
약 3시간에 한번씩 서버와 통신을 해야 하는데
문제가 단말이 슬립으로 빠지면 시간이 미세하게 어긋나더군요 그래서 1~10분 정도의 오차가 생깁니다.
그래서 통신 전에 강제로 단말을 깨우고 싶은데요
AlarmManager를 써보려 했는데, 제가 잘못 사용한건지 모르겠지만, 이 기능은 서비스가 백그라운드에서 실행중이면 작동하지 않더군요 종료시키면 작동하고요, 제가 만든 어플이 계속 실행되는 어플이라....
wakelock을 써서 하루종일 슬립으로 빠지지 않게 할수도 없고
어떻게 처리해야 할지 조언 부탁드립니다.
감사합니다.
2011.02.15 17:03:57
서비스 시작시(onCreate) Alarm manager를 set 합니다.
BroadcastReceiver 를 상속받은 class를 하나 생성하였고요, manifest에 :remote로 등록도 했습니다.
setRepeating으로 1초에 한번씩 반복되도록 코딩하고 로그를 넣었는데
BroadcastReceiver class의 onReceiver에 들어오지 않더군요
안드로이드 SDK를 참고해보니, alarmManager의 경우 엑티비티가 실행중이지 않을때만 (맞는지 모르겠지만) 작동한다고 되어있는듯 하여 그런가보다 하고 넘어갔습니다만, 제가 잘못 사용한건지도 모르겠네요
제가 대략적으로 짠 코드를 첨부할꼐요
@Override
public void onCreate()
{
setAlarmManager();
}
public void setAlarmManager()
{
Intent intent = new Intent(this, TestClass.class);
PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
long firstTime = SystemClock.elapsedRealtime();
firstTime += 1000;
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, 1000, sender);
}
public class TestClass extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
Log.d("TEST", "TEST");
}
}




서비스에서 wakelock을 걸어주시면 됩니다.
처리가 다 된 시점에서 wakelock을 release하시면 되구요.
AlarmManager에 등록하실때
AlarmManager.RTC_WAKEUP 이나
AlarmManager.ELAPSED_REALTIME_WAKEUP 으로 하시면
자고 있다가도 잘 깨어납니다.