알람 앱을 만들어 Google Play에 배포했습니다. 언제나 그렇듯이, 다른 기능 중에서도 다른 api 수준, 뿌리/비 뿌리, 다른 시간대를 실행하는 8 가지 실제 장치 (나는 에뮬레이터와 작동하지 않음)에서 많은 테스트를 수행했습니다.서로 다른 시간에 AlarmManager가 실행됩니다.
문제는 10'000 회 다운로드 횟수를 초과하면 지정된 시간보다 1 시간 앞당겨 알람이 울리는 사용자가 적고 다른 사람 (4 배)이 알람이 1 시간 후에 불평한다고 불평합니다. 나는 이것을 세계의 다른 장소에서 얻고 있으며 나는 같은 장소에서 5 개의 별을 얻는다. 는 즉시 나는 내 코드의 일부 장소에서 실수로 시간대를 사용했다 생각하지만 사실은 난 단지 내 모든 코드를 사용 하나를
GregorianCalendar gc = new GregorianCalendar();
인스턴스의 종류이다 사용하고있다. 나는 시스템을 사용하여 알람을 설정 알람 관리기 같은 :
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context.getApplicationContext(), AlarmReceiver.class);
GregorianCalendar gc = new GregorianCalendar();
long triggerAtMillis = 0;
if(nextAlarm != null){
triggerAtMillis = System.currentTimeMillis()
+ 60*1000*alarmDifference(nextAlarm, gc.get(Calendar.HOUR_OF_DAY), gc.get(Calendar.MINUTE), true)
- 1000*gc.get(Calendar.SECOND);
}else{
// Log.d("", "nextAlarm: NULL");
return;
}
PendingIntent operation = PendingIntent.getBroadcast(context.getApplicationContext(), REQUEST_CODE_ALARM_BROADCAST, intent, 0);
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);
alarmDifference 방법은 매우 간단합니다 :
public static int alarmDifference(Alarm alarm, int hour, int minute, boolean inverse) {
int hours = hour - alarm.getHour();
if(inverse){
hours *= -1;
}
if(hours < 0)
hours += 24;
int minutes = minute - alarm.getMinute();
if(inverse){
minutes *= -1;
}
if(hours==0 && minutes<0){
hours = 23; //this happens if we set the time to the current hour
}
if(minutes < 0)
minutes += 60;
// Log.d("", "Time left: "+ hours+" hours, " + minutes+" minutes");
return hours*60 + minutes;
}
내가 API 레벨 17을 목표로하고있어, 그래서 나는이 문제로 실행되지 않습니다 시스템이 배달 시간을 기하고 있지 않으며 AlarmManager.setExact (...)과 함께 작업해야합니다.
내 서비스를 깨우려면 WakefulBroadcastReceiver를 사용하고 있으므로 직접 WakeLock을 처리 할 필요가 없습니다.
나는이 사이트에서 많은 연구를했으며 행운없이 다른 접근법을 시도했다.
미리 감사드립니다.
오전과 오후를 확인 하시겠습니까? –
Calendar.HOUR_OF_DAY로 작업하고있는 코드에 주목하십시오. 24 시간 형식이므로 am/pm을 확인할 필요가 없습니다. –