2014-09-13 5 views
2

알람 앱을 만들어 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을 처리 할 필요가 없습니다.

나는이 사이트에서 많은 연구를했으며 행운없이 다른 접근법을 시도했다.

미리 감사드립니다.

+0

오전과 오후를 확인 하시겠습니까? –

+0

Calendar.HOUR_OF_DAY로 작업하고있는 코드에 주목하십시오. 24 시간 형식이므로 am/pm을 확인할 필요가 없습니다. –

답변

0

나는 문제가이 라인에 확신 :

triggerAtMillis = System.currentTimeMillis() 
       + 60*1000*alarmDifference(nextAlarm, gc.get(Calendar.HOUR_OF_DAY), gc.get(Calendar.MINUTE), true) 
       - 1000*gc.get(Calendar.SECOND); 

이 작업은 원자 일이 보장 하지입니다. 즉,

  • gc.get (Calendar.HOUR_OF_DAY)
  • gc.get (Calendar.MINUTE)

다른 시간, 예를 들면 일어날 수 시계가 14:59:99에서 15:00:00으로 변경되는 동안 시간이 14 분, 00 분 또는 15 분과 59 분이 걸릴 수 있습니다.

대신에 시간/분/초를 추출합니다. 불변의 타임 스탬프 치 (예를 들어, http://developer.yahooapis.com/TimeService/V1/getTime?appid=YahooDemo) 인터넷 서비스에서 앱 부하 세계 시간

및 장치의 시간대와 시간 비교 :

+0

나는 이것을 시도 할 것이지만 Google Analytics에 따르면 사용자는 XX : 59 또는 XX : 00에 시간을 설정하지 않습니다. 내가 알려 주마. –

+0

GregorianCalendar 객체 ** gc **는 인스턴스 생성 후에 변경되지 않으므로 변경할 수 없습니다.알람 diference는 POJO 인 사용자 정의 Alarm 객체로 계산되므로 시스템 시간이 변경되면 ** triggerAtMillis ** 값이 변경되지 않습니다. –

1

당신은 문제를 찾기 위해 다음 사용을 시도 할 수 있습니다. 기기에서 전 세계적으로 또는 앱에서 문제가 무엇인지 확인할 수 있습니다.

+0

앱이 오프라인으로 작동해야 유효하지 않습니다. 어쨌든 고마워. –

+0

또한 GPS (NMEA) 데이터로부터 시간 비교를 시도해 볼 수 있습니다 (이번에는 정확하지 않습니다). 인터넷 사용은 필요 없지만 위치 권한이 필요합니다. –

+0

그런 식으로하면 사용자가 위치를 사용하지 못하게되거나 잠시 동안 위치 업데이트를받지 못할 수 있기 때문에 더 많은 단점이 있습니다. 작동하지 않습니다. –

관련 문제