본문 바로가기

플밍 is 뭔들/안드로이드

[안드로이드] 알람 및 알람 리시버 구현/ 특정 시간, 특정 요일에 울리게 하는 알람

※ 재미로 만든 첫 어플의 기능 중 알람 시계 어플 처럼 지정한 요일에 지정한 시간에
알람을 울리게 하는 기능이 필요했다. 소스는 다음과 같다.

1.소스 코드 내에 알람을 설정하는 코드를 생성

setAlarm() 함수와 cancelAlarm()함수 구현
public void setAlarm(){

    Intent intent = new Intent(context, AlarmReceiver.class);
    intent.putExtra("no"alarmIdx);
    AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(contextalarmIdx, intent, 0);

    //알람 시간 설정
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEARyear);
    switch (month){
        case 1:
            calendar.set(Calendar.MONTH, Calendar.JANUARY);
            break;
        case 2:
            calendar.set(Calendar.MONTH, Calendar.FEBRUARY);
            break;
        case 3:
            calendar.set(Calendar.MONTH, Calendar.MARCH);
            break;
        case 4:
            calendar.set(Calendar.MONTH, Calendar.APRIL);
            break;
        case 5:
            calendar.set(Calendar.MONTH, Calendar.MAY);
            break;
        case 6:
            calendar.set(Calendar.MONTH, Calendar.JUNE);
            break;
        case 7:
            calendar.set(Calendar.MONTH, Calendar.JULY);
            break;
        case 8:
            calendar.set(Calendar.MONTH, Calendar.AUGUST);
            break;
        case 9:
            calendar.set(Calendar.MONTH, Calendar.SEPTEMBER);
            break;
        case 10:
            calendar.set(Calendar.MONTH, Calendar.OCTOBER);
            break;
        case 11:
            calendar.set(Calendar.MONTH, Calendar.NOVEMBER);
            break;
        case 12:
            calendar.set(Calendar.MONTH, Calendar.DECEMBER);
            break;

    }
    calendar.set(Calendar.DATEday);
    calendar.set(Calendar.HOUR_OF_DAYhour);
    calendar.set(Calendar.MINUTEminute);
    calendar.set(Calendar.SECOND0);
    calendar.set(Calendar.MILLISECOND0);

    long aTime = System.currentTimeMillis();
    long bTime = calendar.getTimeInMillis();

    //하루의 시간을 나타냄
    long interval = 1000 60 60 24

     //만일 내가 설정한 시간이 현재 시간보다 작다면 알람이 바로 울려버리기 때문에 이미 시간이 지난 알람은 다음날 울려야 한다.
    while(aTime>bTime){
        bTime += interval;
    } 

     //알람 매니저를 통한 반복알람 설정
    alarmManager.setRepeating(AlarmManager.RTC, bTime, interval, pendingIntent);

}

public void cancelAlarm(){

    AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);
    Intent intent = new Intent(context, AlarmUserViewActivty.class);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(contextalarmIdx, intent, 0);
    alarmManager.cancel(pendingIntent);

}

*소스 부연설명
 - PendingIntent pendingIntent = PendingIntent.getBroadcast(contextalarmIdx, intent, 0);
     alarmIdx - 알람을 구분할 고유값
     intent - 알람이 울릴 때 이동할 클래스의 정보와 변수값들을 저장해 둔다.
     getBroadcast - getActivity를 사용하면 바로 activity로 가기 때문에 요일 처리를 못한다.
                         그래서 getBroadcast를 사용하여 알람이 울릴 시간에 브로드캐스트 리시버로 보낸다음 
  요일 처리를 해준 다음 결과에 따라 activity로 보낼지 말지를 결정한다.
            

 - alarmManager.setRepeating(AlarmManager.RTC, bTime, interval, pendingIntent);
     AlarmManager.RTC - Real time clock 으로 실제 시간 기준으로 설정
     bTime - 알람을 울릴 시간
     interval - 다음 알람이 울리기 전까지의 시간


2.리시버를 통해 알람이 울릴 시간이 됐을 때 요일구분

AlarmReceiver.java
public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        final int no = intent.getIntExtra("no", -1);
        WritingInfo wi = new WritingInfo();

        if(no == -1){
            Log.i("Error""AlarmReceiver intent error");
            return;
        }

        final String[] week = {"일""월""화""수""목""금""토"};
        ArrayList<AlarmInfoVO> alarmInfo = wi.selectAlarmInfo(context, no);
        Calendar calendar = Calendar.getInstance();
        String todayDayOfWeek = week[calendar.get(Calendar.DAY_OF_WEEK)-1];
        String[] alarmDayOfWeek = alarmInfo.get(0).getDayOfWeek().split("/");
        int useOrNot = alarmInfo.get(0).getUseOrNot();

        boolean weekCheck =false;

        for(int i =0; i<alarmDayOfWeek.length;i++){
            if(alarmDayOfWeek[i].equals(todayDayOfWeek)){
                weekCheck=true;
                break;
            }
        }

            //위에서 오늘의 요일과 저장해놓은 요일과 비교를 한 다음 오늘이 알람이 울려야 할 요일이면 Activity를 호출한다.
        if(!weekCheck) {
            return;
        }else if(weekCheck){
            if(useOrNot ==1){
                Intent activityIntent = new Intent(context, AlarmUserViewActivty.class);
                activityIntent.putExtra("no", alarmInfo.get(0).getListNo());
                activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(activityIntent);
            }
        }
    }
}


3.manifest에 리시버 추가

AndroidManifest.xml
<application

         -- Manifest 내용 --

<receiver
    android:name="패키지명.AlarmReceiver"/>

</application>