본문 바로가기
Develop/Android

[Android] AlarmManager를 이용한 반복적인 동작 구현

by 투게더리 2022. 2. 4.
반응형

1. 언제 필요한가?

 주기적으로 (10분 간격) 서버에 정보 요청하는데 Alarm이 적절하다고 생각해서 구현


2. 진행 과정

a. AlarmReceiver class 추가 (알람 이벤트를 받기 위한 broadcast receiver)

b. AlarmManager로 알람 추가 및 삭제 코드 구현

 


a. AlarmReceiver class 추가 (알람 이벤트를 받기 위한 broadcast receiver)

AlarmManager로 알람을 추가했을때 이벤트를 받기 위한 recevier를 추가한다.

예를 들어 1분뒤로 알람을 추가하면 알람 receiver가 1분뒤 호출되게 된다.

이때 어떤 alarm인지는 "requestCode"로 구분 되기 때문에 하나의 receiver로 모든 alarm을 분기해서 처리 할 수 있다.

package com.mango.maketogether.mangcoin.service;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

import com.mango.maketogether.mangcoin.utils.AlarmController;

public class AlarmReceiver extends BroadcastReceiver {
    private static final String TAG = "AlarmReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {
        int reqCode = intent.getExtras().getInt("requestCode");

        Log.i(TAG, "onrecive : " + reqCode);

        if(reqCode == xxx) {
            //todo something
        }
    }
}

 

AndroidManifest에 receiver를 추가 한다.

        <receiver
            android:name=".service.AlarmReceiver"
            android:enabled="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"></action>
            </intent-filter>
        </receiver>

 


b. AlarmManager로 알람 추가 및 삭제 코드 구현

AlarmManager로 알람을 추가할 때 x분 뒤에 알람을 울리게 할지 아니면 3시 15분등 특정 시간에 울리게 할지 두가지 방법이 있다.

RTC : 3시 15분 등 특정시간에 울리게

 

ELAPSED_REALTIME_WAKEUP : 지금 시간으로 부터 x분 뒤에 울리게

 

나의 경우는 x분 뒤에 울리게가 필요해 ELAPSED REALTIME WAKEUP을 사용하였고 사용방법은 AlarmManager에 넣는 인자만 다를 뿐이다.

 

아래 문구는 현재시간으로 부터 10분 뒤에 이벤트를 발생해라는 뜻이다.

AlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,  SystemClock.elapsedRealtime() +
                        60* 1000 *10, alarmIntent);

+import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.util.Log;

import com.mango.maketogether.mangcoin.service.AlarmReceiver;

public class AlarmController {
    private static final String TAG = "AlarmController";

    private Context context;

    private static AlarmController sInstance;
    private AlarmManager alarmMgr;

    private AlarmController(Context context) {
        this.context = context;
        alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    }

    public void setAlarm(int reqCode, long timeMill) {
        Log.i(TAG, "setAlarm req : " + reqCode + ", timeMill : " + timeMill);
        Intent intent = new Intent(context, AlarmReceiver.class);
        intent.putExtra(KEY_REQ_CODE, reqCode);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, reqCode, intent, 0);

        alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                SystemClock.elapsedRealtime() +
                        timeMill, alarmIntent);
    }

    public void cancelAlarm(int reqCode) {
        Log.i(TAG, "cancelAlarm req : " + reqCode);
        Intent intent = new Intent(context, AlarmReceiver.class);
        PendingIntent alarmIntent = PendingIntent.getBroadcast(context, reqCode, intent, 0);

        if (alarmMgr != null) {
            alarmMgr.cancel(alarmIntent);
        }
    }

 


3. 추가 정보

위 알람은 이벤트를 한번만 호출하는데 반복적인 호출이나, 시스템 리부팅 시 다시 알람을 등록하는 방법등은

아래 developer 사이트를 참고하면 더 많은 정보를 알 수 있다.

 

https://developer.android.com/training/scheduling/alarms?hl=ko 

 

반복 알람 예약  |  Android 개발자  |  Android Developers

반복 알람 예약 알람(AlarmManager 클래스 기반)을 사용하면 애플리케이션이 사용되지 않을 때 시간 기반 작업을 실행할 수 있습니다. 예를 들어, 알람을 사용하여 일기예보를 다운로드하는 것과 같

developer.android.com

 

다른 Post 보기

 

반응형

댓글