태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

원하는 시간에 작업을 수행하려면? - AlarmManager 사용하기

2011.04.22 23:42



애플리케이션을 작성하다 보면 원하는 시간에 특정 작업을 수행하도록 해야 하는 경우가 있습니다. 알람 시계가 대표적인 예라 할 수 있지요.

애플리케이션에서 특정 시간에 어떤 작업을 실행하도록 하는 방법은 매우 다양합니다. 여기에서는 비교적 쉽고 간편하게 특정 시간에 원하는 작업을 수행하도록 할 수 있는 AlarmManger의 사용 방법에 대해 소개합니다.

 AlarmManger는 다음 요소와 관련된 작업을 쉽게 처리할 수 있도록 합니다.

  • 어떤 시간을 기준으로 하는가?
  • 단말기가 대기 모드일 때도 작업을 수행할 것인가?
  • 단발성인가, 반복해서 수행하는가?
  • 정확한 시각에 수행되어야 하는가?


각 특성과 관련있는 항목에 대해 자세히 알아보겠습니다.


어떤 시간을 기준으로 하는가?
 
알람을 실행할 때 기준으로 할 시각을 설정합니다. 단말기가 시작된 이후로 경과된 시간(ELAPSED_REALTIME) 혹은 실제 시간 (RTC; Real-time clock) 중 하나를 기준으로 합니다.

 
단말기가 대기 모드일 때도 작업을 수행할 것인가?
 
단말기가 대기 상태일때도 작업을 수행할지, 아니면 대기 상태에서는 작업을 수행하지 않을지 결정합니다. 대기 상태일 때 작업을 수행할 경우 단말기가 대기 상태에서 깨어나 작업을 수행합니다.

위의 두 가지 특징을 조합하여 AlarmManager에서 알람의 속성을 지정합니다. AlarmManager에서 지정할 수 있는 알람 속성은 다음과 같습니다.

  • AlarmManager.ELAPSED_REALTIME : 단말기가 부팅된 이후 경과된 시간을 기준으로 합니다.
  • AlarmManager.ELAPSED_REALTIME_WAKEUP : ELAPSED_REALTIME과 동일하며, 대기상태일 경우 단말기를 활성상태로 전환한 후 작업을 수행합니다.
  • AlarmManager.RTC : 실제 시간을 기준으로 합니다.
  • AlarmManager.RTC_WAKEUP : RTC와 동일하며, 대기상태일 경우 단말기를 활성 상태로 전환한 후 작업을 수행합니다.
     
단발성인가, 반복해서 수행하는가?
 
알람을 설정한 후 한 번만 수행되도록 할 지, 반복해서 수행되도록 할 지 설정합니다.

 
정확한 시각에 수행되어야 하는가?
 
알람이 지정된 시각에 정확히 수행되어야 할지, 아니면 어느 정도의 오차가 있어도 무방할지 설정합니다. 정확한 시각에 실행되도록 해야 할 경우 배터리를 추가로 소모하므로 필요에 따라 적절한 것을 설정합니다.

위에서 정리한 내용들을 기반으로 AlarmManager를 사용하여 알람을 관리하는 메서드에 대해 알아보겠습니다.


API
public void set (int type, long triggerAtTime, PendingIntent operation)
한  번만 수행되는 알람을 예약합니다.

type에는 알람의 속성을 지정합니다. 알람에서 기준으로 할 시간 및 대기 모드에서도 알람을 실행할지 여부를 설정하게 됩니다. triggerAtTime에는 알람을 실행할 시각을, operation에는 실행할 작업을 지정합니다.

triggerAtTime에 들어가는 알람 실행 시각은 알람 속성에 따라 기준 시각이 달라집니다. ELAPSED_REALTIME을 기준으로 하는 알람일 경우 SystemClock.elapsedRealtime()을 사용하여 단말기가 부트된 이후로 경과된 시각을 받아 사용하면 되고, RTC를 기준으로 하는 알람일 경우 일반적으로 많이 사용하는 System.currentTimeMillis()를 사용하여 밀리초 단위의 시각을 받아 사용하면 됩니다.

다음, 반복되는 알람을 설정하는 메서드를 알아보겠습니다.

API
public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
반복되는 알람을 예약합니다.

다른 속성들은 set() 메서드와 동일하며, interval에는 알람 실행 주기를 밀리초 단위로 입력합니다. 이 알람은 항상 지정된 시각에 정확하게 수행됩니다.

지정된 시각에 굳이 '정확히' 수행될 필요는 없고 지정된 시각과 근사하게 실행되기만 하면 무방한 경우에는 다음 메서드를 사용하면 배터리 소모를 절약할 수 있습니다.

API
public void setInexactRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
setRepeating() 메서드와 동일하나, 알람이 지정된 시각에 정확하게 일어나지 않을 수 있습니다. 정확성보다는 일정 주기로 특정 작업을 수행하기만 하면 될 때 사용합니다.

다음 포스트에서는 AlarmManager를 사용하는 예를 통해 자세한 사용법을 알아보겠습니다. :)
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

커니 안드로이드 개발 팁/일반 , , , ,

  1. Blog Icon
    도와주세여 ㅠ.ㅠ

    안녕하세여 제가 기본 알람을 구현 했는대여 이게 정해진 시간이 되면 액티비티 만 뜨고 소리가 나지를 않습니다
    어떻게 소스를 수정 해야 화면 까지 뜨면서 소리가 날가여 ?


    package abc.prj1;

    import java.util.*;

    import android.app.*;
    import android.content.*;
    import android.os.*;
    import android.util.*;
    import android.view.*;
    import android.widget.*;
    import android.widget.DatePicker.OnDateChangedListener;
    import android.widget.TimePicker.OnTimeChangedListener;


    public class alarm extends Activity implements OnDateChangedListener, OnTimeChangedListener {
    private AlarmManager mManager;
    // 설정 일시
    private GregorianCalendar mCalendar;
    //일자 설정 클래스
    private DatePicker mDate;
    //시작 설정 클래스
    private TimePicker mTime;
    /*
    * 통지 관련 맴버 변수
    */
    private NotificationManager mNotification;

    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    //통지 매니저를 취득
    mNotification = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);



    //알람 매니저를 취득
    mManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);

    //현재 시각을 취득
    mCalendar = new GregorianCalendar();
    Log.i("HelloAlarmActivity",mCalendar.getTime().toString());

    //셋 버튼, 리셋버튼의 리스너를 등록


    setContentView(R.layout.alarm_page);
    Button c = (Button)findViewById(R.id.back);
    c.setOnClickListener (new View.OnClickListener() {
    public void onClick (View v) {

    finish();
    }
    });
    Button b = (Button)findViewById(R.id.set);
    b.setOnClickListener (new View.OnClickListener() {
    public void onClick (View v) {
    setAlarm();
    }
    });
    b = (Button)findViewById(R.id.reset);
    b.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
    resetAlarm();
    }
    });
    //일시 설정 클래스로 현재 시각을 설정
    mDate = (DatePicker)findViewById(R.id.date_picker);
    mDate.init (mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH), this);
    mTime = (TimePicker)findViewById(R.id.time_picker);
    mTime.setCurrentHour(mCalendar.get(Calendar.HOUR_OF_DAY));
    mTime.setCurrentMinute(mCalendar.get(Calendar.MINUTE));
    mTime.setOnTimeChangedListener(this);
    }

    //알람의 설정
    private void setAlarm() {
    mManager.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pendingIntent());
    Log.i("HelloAlarmActivity", mCalendar.getTime().toString());
    }
    //알람의 해제
    private void resetAlarm() {
    mManager.cancel(pendingIntent());
    }
    //알람의 설정 시각에 발생하는 인텐트 작성
    private PendingIntent pendingIntent() {
    Intent i = new Intent(getApplicationContext(), alarm.class);
    PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
    return pi;
    }
    //일자 설정 클래스의 상태변화 리스너
    public void onDateChanged (DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    mCalendar.set (year, monthOfYear, dayOfMonth, mTime.getCurrentHour(), mTime.getCurrentMinute());
    Log.i("HelloAlarmActivity", mCalendar.getTime().toString());
    }
    //시각 설정 클래스의 상태변화 리스너
    public void onTimeChanged (TimePicker view, int hourOfDay, int minute) {
    mCalendar.set (mDate.getYear(), mDate.getMonth(), mDate.getDayOfMonth(), hourOfDay, minute);
    Log.i("HelloAlarmActivity",mCalendar.getTime().toString());
    }





    }




    }

  2. 안녕하세요.
    보다 궁금한 점이 있어 문의드립니다.
    일정시간 이후 해당 어떤 작업이 필요하다면,
    AlarmManager(android) 가 낳을까요? TimerTask(java) 가 낳을까요?
    용도는 android APP Service 에서 사용합니다.