안드로이드 재부팅을 하면 알람매니저가 리셋되는 것을 확인했습니다.
그래서 SharedPreferences을 이용하여 알람지정할 시간을 저장한 후
재부팅시 SharedPreferences 값을 받아서 알람을 재설정하도록 구현을 했는데
재부팅전에 알람을 9시20분 9시25분 9시30분 9시35분으로 입력을 하고
9시20분에 알람이 울린 이후 스마트폰을 재부팅했습니다.
재부팅이후 앱이 실행된 이후에 9시22분 앱이 켜지고 얼마후에 알람이 작동되더라구요.
설정된 시간도 아닌데 동작이 되더라구요.
그리고 9시25분에 정상적으로 입력한 시간에 알람이 울렸습니다.
재부팅시 왜 제시간이 아닌데 알람이 울리는지 이해가 되지 않습니다.
재부팅하고 Logcat보려고하니 뜨지가 않더라구요......
아래는 재부팅시 알람을 등록하는 부분입니다.
각각 알람4개의 ID를 따로 주었고요.
각알람의 String 배열은 시,분,알람On/off 상태를 나타냅니다.
public class RestartService extends BroadcastReceiver {
int alarmId;
@Override
public void onReceive(Context context, Intent intent) {
// 폰 재부팅시 서비스 등록
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
String medication_info = SharedPreferenceUtil.getSharedPreference(context, "save_info");
if(medication_info != null){
String[] data = medication_info.split("/");
String[] alarm1_medication = data[0].split(":");
String[] alarm2_medication = data[1].split(":");
String[] alarm3_medication = data[2].split(":");
String[] alarm4_medication = data[3].split(":");
long oneday = 24 * 60 * 60 * 1000;// 24시간
Calendar calendar = Calendar.getInstance();
AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent noti = new Intent(context,NotiBroadcast.class);
PendingIntent sender;
if(alarm1_medication[2].equals("1")){
alarmId=111111;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
if(alarmManager !=null){
alarmManager.cancel(sender);
}
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm1_medication[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm1_medication[1]));
calendar.set(Calendar.SECOND, 0);
//알람 시간
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), oneday, sender);
Log.e("알람 ", "해당 알람번호 : "+alarmId +"|| 알람 설정 시간 : " + calendar.getTime().toString());
}else{
alarmId=111111;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(sender);
Log.e("알람취소 ", "해당 취소 알람번호 : "+alarmId);
}
if(alarm2_medication[2].equals("1")){
alarmId=222222;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
if(alarmManager !=null){
alarmManager.cancel(sender);
}
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm2_medication[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm2_medication[1]));
calendar.set(Calendar.SECOND, 0);
//알람 시간
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), oneday, sender);
Log.e("알람 ", "해당 알람번호 : "+alarmId +"|| 알람 설정 시간 : " + calendar.getTime().toString());
}
else{
alarmId=222222;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(sender);
Log.e("알람취소 ", "해당 취소 알람번호 : "+alarmId);
}
if(alarm3_medication[2].equals("1")){
alarmId=333333;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
if(alarmManager !=null){
alarmManager.cancel(sender);
}
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm3_medication[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm3_medication[1]));
calendar.set(Calendar.SECOND, 0);
//알람 시간
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), oneday, sender);
Log.e("알람 ", "해당 알람번호 : "+alarmId +"|| 알람 설정 시간 : " + calendar.getTime().toString());
}
else{
alarmId=333333;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(sender);
Log.e("알람취소 ", "해당 취소 알람번호 : "+alarmId);
}
if(alarm4_medication[2].equals("1")){
alarmId=444444;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
if(alarmManager !=null){
alarmManager.cancel(sender);
}
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(alarm4_medication[0]));
calendar.set(Calendar.MINUTE, Integer.parseInt(alarm4_medication[1]));
calendar.set(Calendar.SECOND, 0);
//알람 시간
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), oneday, sender);
Log.e("알람 ", "해당 알람번호 : "+alarmId +"|| 알람 설정 시간 : " + calendar.getTime().toString());
}else{
alarmId=444444;
sender = PendingIntent.getBroadcast(context, alarmId, noti, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(sender);
Log.e("알람취소 ", "해당 취소 알람번호 : "+alarmId);
}
}
Intent i = new Intent(context, ServiceClass.class);
i.putExtra("restart", "restart");
context.startService(i);
}
// 서비스 죽일때 알람으로 다시 서비스 등록
if (intent.getAction().equals("ACTION.RESTART.ServiceClass")) {
Intent i = new Intent(context, ServiceClass.class);
context.startService(i);
}
}
}
<receiver android:name="healthall.company.cabinet.RestartService"
android:enabled="true"
android:exported="false"
android:label="RestartService"
android:process=":remote" >
<intent-filter>
<action android:name="ACTION.RESTART.ServiceClass" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>