마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 알람매니저 재부팅시 등록문의

0 추천

안드로이드 재부팅을 하면 알람매니저가 리셋되는 것을 확인했습니다.

그래서 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>

 

쿠쿠부다스 (6,470 포인트) 님이 2017년 3월 3일 질문

1개의 답변

0 추천
 
채택된 답변
현재 시간보다 과거의 시간을 등록하면 곧바로 동작합니다.
쎄미 (162,410 포인트) 님이 2017년 3월 3일 답변
쿠쿠부다스님이 2017년 3월 3일 채택됨
입력받은 값을 등록을 할 경우에 현재시간보다 앞시간을 입력할 경우도 있는데요..
그렇게 되면 어떻게 처리를 해야하는지 팁을 주실수 있을까요?
쌔미님이 다 말씀하셨습니다
알람 등록시 현재 시간과 비교하는 구문이 없습니다
체크하시고 등록하세요
...