안드로이드 SDK에서 일정시간 후에 일어나는 혹은 주기적인 작업처리 방법에 대해서 알아보겠습니다. 이러한 Timing 작업을 처리하기위해 Handler와 AlarmManager를 사용할 수 있는데 둘 간의 차이점을 잘알고 사용하셔야 합니다.

먼저 AlarmManager는 현재 특정 어플리케이션이 실행되고 있지 않더라도 특정 시점에 해당 어플의 코드가 실행되도록 할때 사용됩니다. 현재 내 어플리케이션의 Activity가 보여지고 실행되고 있는 상황에서 타이밍 작업을 할때에는 Handler를 사용하는 것이 바람직합니다. AlarmManager는 단말이 슬립모드에 들어가있을 경우에도 단말을 깨워서 작업처리를 할 때 사용할 수 있습니다. (RTC의 Interrupt를 사용한다고 생각하시면 됩니다.)

거의 대부분 UI상에서의 타이밍 작업은 Handler로 이루어집니다. Handler는 특정 시간후에 작업을 처리하기 위해서 사용되는 경우와 UI 쓰레드상에서의 코드 실행을 위해서 사용되는 경우가 있습니다. 두번째 특징에 있어서 Handler는 java.util.Timer와도 구분된다고 할 수 있습니다. 대부분의 View등 UI와 관련된 클래스는 UI 쓰레드에서 호출해주어야만 정상 작동합니다. 특정 시간후에 일어나는 작업이 메인 UI와 관련된 함수들을 호출한다면 Handler를 사용해야 합니다. 

가장 편하게 사용할 수 있는 것은 Runnable을 통해 작업을 처리하는 것입니다.
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
//Do Something
}, 3000); 

일정시간후에 특정 View에 작업을 하는 경우 해당 View의 Thread로 Runnable을 보내기 위해서는 View의 postDelayed함수를 사용해도 비슷한 역할을 합니다.
View.postDelayed(Runnable action, long delayMillis)

AlarmManager는 현재 실행되고 있지 않더라도 어플을 다시 불러와 실행시켜야할 경우에 사용됩니다.

        final Intent intent = new Intent(context, MyService.class);
        final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0);
        
        Calendar cal = nextScheduleTime();
        
        AlarmManager am = (AlarmManager)context.getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 5 * 60 * 1000, pending);

AlarmManager는 일정 시간후에 해당 Intent를 Broadcast해줄 수 있게 설정할수 있습니다. 위의 예제에서는 특정 시간에 MyService라는 서비스를 Start하도록 코딩되어있습니다. 실행되는 시간은 Calendar 클래스를 통해서 편리하게 시간을 설정하실 수도 있습니다. 백그라운드에서 주기적으로 동작하는 어플리케이션에서도 AlarmManager를 통해 잘 설정해주어야 합니다.