※ 재미로 만든 첫 어플의 기능 중 알람 시계 어플 처럼 지정한 요일에 지정한 시간에
알람을 울리게 하는 기능이 필요했다. 소스는 다음과 같다.
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(context, alarmIdx, intent, 0);
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra("no", alarmIdx);
AlarmManager alarmManager = (AlarmManager)context.getSystemService(ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmIdx, intent, 0);
//알람 시간 설정
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
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.DATE, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long aTime = System.currentTimeMillis();
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.DATE, day);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
long aTime = System.currentTimeMillis();
long bTime = calendar.getTimeInMillis();
//하루의 시간을 나타냄
long interval = 1000 * 60 * 60 * 24;
//만일 내가 설정한 시간이 현재 시간보다 작다면 알람이 바로 울려버리기 때문에 이미 시간이 지난 알람은 다음날 울려야 한다.
while(aTime>bTime){
bTime += interval;
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(context, alarmIdx, intent, 0);
alarmManager.cancel(pendingIntent);
}
*소스 부연설명
- PendingIntent pendingIntent = PendingIntent.getBroadcast(context, alarmIdx, 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();
@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;
}
}
}
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);
}
}
}
}
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>
'플밍 is 뭔들 > 안드로이드' 카테고리의 다른 글
[안드로이드] 캔버스를 이용한 원형차트 만들기 (0) | 2017.06.19 |
---|---|
[안드로이드] 특정 Activity에서 다른 Activity의 ListView새로고침하기 (0) | 2017.03.05 |
[안드로이드] 스크롤뷰 스크롤 끝까지 내리기 (0) | 2017.02.20 |
[안드로이드] EditText 자동 포커스, 키보드 자동실행 막는법, 키보드 실행시 화면 사이즈 재설정 (0) | 2017.02.11 |
[안드로이드] Back(뒤로가기) 버튼 2번 터치시 앱 종료하기 (0) | 2017.02.11 |