티스토리 뷰




 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.2  
   API LEVEL : 8 
   이클립스 버젼 : Indigo
   테스트단말 : 삼성갤럭시 S2




안드로이드/Android 알람매니저(AlarmManger)를 사용해서 알람(Alarm) 등록하기~!



이미지 출처 : http://www.funshop.co.kr/vs/detail.aspx?categoryno=1338&itemno=8041



안드로이드에서 알람(Alarm)은 우리가 현재 사용하는 알람이라고 생각하시면 됩니다. 평소 시계나 휴대폰 알람을 맞춰 놓고 매일 아침 기상시간, 특정한 날, 꼭 잊지 말아야 할 시간이 왔을 때 나에게 알려주는 용도로 사용하는데요..!! 안드로이드 알람(Alarm) 도 마찬가지로 내가 꼭 필요한 시점에 한번, 또는 매번 반복하는 기능을 제공 합니다.


자 그럼 사용 방법에 대해 알아 보겠습니다.~!


package arabiannight.tistory.com.alarmmanager;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class TestAlarmManagerActivity extends Activity implements OnClickListener{
	
	private static final String TAG = "TestAlarmManagerActivity";
	private static final String INTENT_ACTION = "arabiannight.tistory.com.alarmmanager";
	
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        setLayout();
        
    }

	@Override
	public void onClick(View v){
		switch (v.getId()) {
		case R.id.btn_set_alarm:
			setAlarm(this, 5000);
			Toast.makeText(getApplicationContext(), "setAlarm()", Toast.LENGTH_SHORT).show();
			break;
			
		case R.id.btn_release_alarm:
			releaseAlarm(this);
			Toast.makeText(getApplicationContext(), "releaseAlarm()", Toast.LENGTH_SHORT).show();
			break;

		default:
			break;
		}
	}
	
	// 알람 등록
	private void setAlarm(Context context, long second){  
		Log.i(TAG, "setAlarm()"); 
		AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

		Intent Intent = new Intent(INTENT_ACTION);
		PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);
		
		alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + second, pIntent);
	}
	
	// 알람 해제
	private void releaseAlarm(Context context){  
		Log.i(TAG, "releaseAlarm()"); 
		AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

		Intent Intent = new Intent(INTENT_ACTION);
		PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);
		alarmManager.cancel(pIntent);
		
		// 주석을 풀면 먼저 실행되는 알람이 있을 경우, 제거하고
		// 새로 알람을 실행하게 된다. 상황에 따라 유용하게 사용 할 수 있다.
//		alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pIntent);
	}
	
	/*
	 * Layout
	 */
	private Button[] mButtons;
	
	private void setLayout(){
		mButtons = new Button[]{
			(Button) findViewById(R.id.btn_set_alarm),
			(Button) findViewById(R.id.btn_release_alarm)
		};
		
		for(Button b : mButtons)
			b.setOnClickListener(this);
		
	}
	
}


알람 등록 하는 부분 입니다. 등록한 초(second) 시간이 되면, PendingIntent 를 실행해 줍니다. PendingIntent 에는 Intent 를 추가해 주기 때문에, 해당 Intent Action을 가진 Intent를 호출해 줍니다.

// 알람 등록
	private void setAlarm(Context context, long second){  
		Log.i(TAG, "setAlarm()"); 
		AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

		Intent Intent = new Intent(INTENT_ACTION);
		PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);
		
		alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + second, pIntent);
	}



getActivity 대신 브로드캐스트를 호출하고 싶으면 getBroadcast , 서비스를 호출하고 싶으면, getService 를 호출 하시면 됩니다.

 

 PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);



PendingIntent를 사용하지 않고, Activity를 호출하는 또 하나의 방법은 Intent.FLAG_ACTIVITY_NEW_TASK 를 추가 하셔서 호출 하는 방법이 있습니다.


만약 반복 사용을 위한 알람을 등록하고 싶으시면 alarmManager.setRepeating 메서드를 이용하시면 반복되는 알람 작업을 수행 할 수 있습니다.



알람을 해제 하는 부분 입니다.

	// 알람 해제
	private void releaseAlarm(Context context){  
		Log.i(TAG, "releaseAlarm()"); 
		AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);

		Intent Intent = new Intent(INTENT_ACTION);
		PendingIntent pIntent = PendingIntent.getActivity(context, 0, Intent, 0);
		alarmManager.cancel(pIntent);
		
		// 주석을 풀면 먼저 실행되는 알람이 있을 경우, 제거하고
		// 새로 알람을 실행하게 된다. 상황에 따라 유용하게 사용 할 수 있다.
//		alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 3000, pIntent);
	}



alarmManager.cancel(PendingIntent pendingintent) 를 넣어주시면, 해당 Intent의 Action을 가진 PendingInetnt를 제거해 줍니다. 자 어떠신가요?ㅎㅎ 꼭 한번씩 사용해 보시고, 유용하게 사용하셨으면 좋겠습니다.


파일첨부 :



스크린샷 : 










댓글
  • 프로필사진 김종현 소스코드를 그대로 불러왔는데 onClick 부분에서 에러가 떠요.
    @override를 지우라는 식으로 설명이 되어있는데 해봐도 안되네요;
    2012.10.26 20:56
  • 프로필사진 아라비안왕자 음.. 왜 그럴까요? Clean 한번 해보시고 다시 해보세요. 안되면 구글링 해보시길 바랍니다. 2012.10.29 21:23 신고
  • 프로필사진 김락영 안녕하세요 질문이 있습니다.

    알람 매니저에 여러개의 알람을 등록했을 경우 매니저를 통해서 알람이 등록되어 있는지 안 등록 되어 있는지 어떻게
    알수 있나요?
    2012.11.22 21:14
  • 프로필사진 아라비안왕자 음.. 그러게요. 일단 구글링으로 한번 검색 해보시는게 좋을 것 같네요.^^ 굳이 알람등록 여부를 확인해야 하는 이유라도 있으신 건지? 알람을 새로 등록하게 되면 PendingIntent로 등록된 기존 알람을 cancle 해주고 새로 등록 하셔도 별 문제 없을 것 같습니다만.. 뭘 하실려지는 모르니 일단 구글링으로 검색 해보시는게 제일 좋을 것 같습니다.^^ 2012.11.28 19:50 신고
  • 프로필사진 장익제 일단 @override를 지운상태이구요, 에뮬을 돌리면 실행은 되는데
    알람등록버튼을 누르면 setAlarm() 이라 뜨고
    알람해제버튼을 누르면 releaseAlarm() 이라 뜨네요..알람이 안됩니다...
    도와주십쇼
    2012.12.07 21:00
  • 프로필사진 아라비안왕자 에뮬레이터에서 알람이 작동하는지 잘모르겠네요^^; 일단은 에뮬레이터에서 작동이 되는건지 구글검색을 먼저 해보시기 바랍니다.^^ 2013.01.02 15:48 신고
  • 프로필사진 알람 어플 저도 지금 알람 기능을 가진 어플을 만들고 있습니다. 어플 구조가 리스트뷰와 데이터베이스의 연동으로 이루어진 구조입니다.
    알람이 여러개입니다. 그래서 개인적인 추측으로는 ...
    alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + second,pIntent);
    이부분이 알람에 정해진 시간을 카운트 다운 해서 시간이 끝나게되면 정해진 이벤트가 발생되는 알람이라고 생각되는데 ..
    알람을 추가하기 위해 alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + second,pIntent); 부분을 다시 호출하면
    전에 있던 알람이 새로운 알람으로 대체(수정)되는게 아닌가합니다.

    개인적인 생각으로는 이런현상이 발생될거 같은데 .. 어떻게 생각하시나요? ㅎㅎ
    2013.02.08 14:42
  • 프로필사진 아라비안왕자 네. 같은 PendingIntent를 가지고 알람을 다시 set해 주는 것이기 때문에 대체 되는게 맞는 것 같습니다.^^ 2013.02.13 02:28 신고
  • 프로필사진 알람 어플 알람의 활성화되는 시간에 대해서 다시 질문드립니다. (질문을 많이해서 너무 죄송스럽습니다.. ㅠㅠ)
    setAlarm(this, 5000);에서 보면 시간으로 5000이 들어가있는데 이게 밀리초 단위로해서 5초지 안습니까?
    그런데 이게 RTC(현재시간) 기준으로 5초뒤에 활성화된다는건데 ...

    (1) 이거를 실제 알람기능에 사용하기 위해서는 RTC를 초기화해서 00시 00분으로 만든다음
    이벤트가 발생할 시간을 밀리초단위로 환산해서 예를들면 ..
    setAlarm(this, 60000); 라고 하면 00시 01분에 이벤트가 발생되는게 맞나요?

    (2) 위의 방법으로 이해한것이 맞다면 .. 어플의 재부팅 이후에도 00시 00분 이라는 기준점을 통하여 알람이 울리게될까요?

    (3) 이렇게 알람의 타이머가 작동되서 알람이 실행되고 매일 같은 시간에 반복되게 하려면 어떤방법을 이용해야할까요?
    개인적인 생각으로는 초기화되지 않은, 즉 2013 / 02 / 14 / 00 / 00 이라는 기준값으로 인해 2013 / 02 / 14 라는 범위를 벋어나면
    알람의 기능을 상실하지 않을까합니다. 시간이 거꾸로 흐르지 않는 이상 ...

    질문이 길어젔군요.. 너무 오래동안 막혀 있다보니 질문할 분도 없어서 이렇게 블로그에 질문드립니다.
    귀중한 시간 긴글 읽어 주셔서 감사합니다.
    2013.02.14 11:49
  • 프로필사진 아라비안왕자 (1) 저도 테스트를 못해봐서 잘은 모르겠지만 만약 00시 00분으로 만들 수 있면 setAlarm(this, 60000) 하면 01시 01분에 이벤트가 발생하는게 맞습니다.

    (2) 재부팅하면 알람들은 사라지게 됩니다. 다시 등록을 해줘야 하는 부분 이구요.

    (3) 서비스를 이용해서 반복적으로 호출을 해주는 방법을 이용하시면 될 듯 합니다. 백그라운드로 돌면서 시간을 체크하고 일정 시간이 되면 알람을 실행해 주는 형식으로 만드시면 될 듯 하네요.

    ^^ 재가 요즘 시간이 너무 없어서 테스트를 못하고 답변 드려서 죄송합니다. 일단 해보시고 다른 궁금하신점 있으시면 문의해 주세요.^^
    2013.02.15 02:28 신고
  • 프로필사진 아라비안왕자 (3) 번말고 알람값을 DB에 저장 하시고, 어플 실행시에 DB에 있는 알람들을 재등록 해주시는게 더 맞는 것 같습니다. 단말 재부팅시 리시버로 받을 수 있기 때문에 재부팅시 어플 실행해주시고 알람 등록해서 사용하시면 될 듯 하네요. 2013.02.17 00:47 신고
  • 프로필사진 김기웅 저기혹시 제가 안드로이드만들기 카페에서 특정 조건이 맞았을떄 알람이 울릴려고 하거든요 예를 들어서 제가 지정한 장소에 사용자가 그 장소로 갔을때 사용자가 설정해놓은 기본 알람음이 울리게만들려고 하거든요 그 방법을 물어보니알람매니저를 이용하라구 하더라구요 알람매니저로 하는게 맞나요 ..? 기본음을 설정하는 방법좀 알려주실수 있나요 ? 2013.05.01 17:43
댓글쓰기 폼