마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

알람매니저와 서비스 관련 질문입니다

0 추천

안녕하세요.

제가 이번에 서비스와 알람매니저를 이용한 어플리케이션을 개발중입니다.

그런데 알람 매니저가 지정된 인터벌에 무관하게 지속적으로 실행되는거 같습니다..

우선 코드 첨부해 보겠습니다.

package com.example.alimee;

import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;

import com.example.alimee.data.SystemWakeUp;

public class UpdateService extends Service {
 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }
 
 @Override
 public void onCreate() {
  // TODO Auto-generated method stub
  super.onCreate();
  SystemWakeUp.acquireCpuWakeLock(this);
 }
 
 @Override
 public void onDestroy() {
  // TODO Auto-generated method stub
  super.onDestroy();
  Log.d("myApp", "destroy...");
  SystemWakeUp.releaseCpuLock();
 }
 
 @Override
 public int onStartCommand(Intent intent, int flags, int startId) {
  // TODO Auto-generated method stub
  startUpdate();
  
  return START_REDELIVER_INTENT;
 }
 
 public void setAlarm() {
  SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(this);
  
  Calendar cal = Calendar.getInstance();
  //cal.add(Calendar.SECOND, 5);
   cal.set(Calendar.HOUR_OF_DAY, 17);
   cal.set(Calendar.MINUTE, 10);
   cal.set(Calendar.SECOND, 0);  

   long interval = 24*60*60*1000; // 24시간
   //long interval = 10*1000;
     
  Intent intent = new Intent(this, UpdateService.class);
     PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, 0);
     
     AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
  am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), interval, pendingIntent);
  
     Log.d("myApp", "start alarm");
     // 체크 해제 시 알람과 서비스 모두 종료
     if(!pref.getBoolean("check", false)) {
      am.cancel(pendingIntent);
      stopSelf();
     }
 }
 
 public void startUpdate() {
  setAlarm();
  
  function f = new function();
  f.a(); // Log.d("myApp", "aaa");
  f.b(); // Log.d("myApp", "bbb");
  f.c(); // Log.d("myApp", "ccc");
 }
}

 코드는 위와 같습니다.

로그를 쭉 확인해 본 결과

지속적으로

start alarm

aaa

bbb

ccc

가 인터벌과 무관하게 무한루프를 돌 듯 찍힙니다;;

그리고 이 상태에서는 알람이나 서비스가 종료가 되지 않습니다.. ㅠ_ ㅠ;;

지정된 시간에 시작되서 인터벌 간격으로 한번씩만 로그가 찍히게 하고 싶은데..

어디에 문제가 있는지

어떻게 고쳐야 하는지 선배님들의 조언과 답변 부탁드리겠습니다...

제너 (160 포인트) 님이 2013년 5월 25일 질문
제너님이 2013년 5월 26일 수정

1개의 답변

0 추천
서비스 라이프 사이클과 관련된 문제입니다.

 

StartCommand 는 서비스가 시작되면 서비스가 종료 될 때까지 무한정 호출됩니다.

따라서, startCommand에 있는 startUpdate() 또한 무한 호출되어

발생하는 문제입니다.

 

한번만 호출되기를 원하신다면 onCreate에 두시면 됩니다.
비뢰광 (7,400 포인트) 님이 2013년 5월 27일 답변
답변 감사드립니다 (__)
추가적으로 한가지 더 질문드리겠습니다;;
제가 구현하고자 하는 것은
위에 알람매니저가 있듯이
setRepeating으로 설정하여
특정 시간에 로그를 출력하고(aaa, bbb, ccc)
서비스를 중지하기 전에는
interval 시간 후에 지속적으로 출력해주는 것을 구현하고 싶습니다
이 문제는 어떻게 해결하면 좋을지 한번더 조언해 주시면 감사하겠습니다..;;
음.. 질문 글들 중에 제너님과 비슷한
사항에 대해 질문하셨던거 답변드린 적이 있는데요,

http://www.masterqna.com/android/5915/%EC%9D%BC%EC%A0%95%EA%B4%80%EB%A6%AC-%EC%95%B1%EC%97%90%EC%84%9C-%EC%95%8C%EB%9E%8C-%EA%B4%80%EB%A0%A8%ED%95%98%EC%97%AC-service%EA%B0%80-%EB%82%98%EC%9D%80%EA%B0%80%EC%9A%94-alarmmanager-%EB%93%B1%EB%A1%9D%EC%9D%B4-%EB%82%98%EC%9D%80%EA%B0%80%EC%9A%94

참고하시면 대략적으로 방향 잡으실 수 있을 것 같습니다.
답변 감사합니다 ^_^
...