2011-08-29 5 views
1

현재 Android의 AlarmManager를 사용하는 애플리케이션을 개발 중입니다. AlarmManager에 새 알람을 추가하려고 시도하고 있지만 여러 시간 동안 여러 가지 작업을 시도하고 여러 스레드를 확인한 후에도 여전히 벽돌 벽에 있습니다. 내 코드에 문제가 있습니까?AlarmManager가 새 알람을 추가하지 않거나 리시버를 트리거하지 않음


주요 활동 - saveAlarm() 함수는

/** 
* Saves the current alarm. Adds to the database if it doesn't already exist, or updates if it does. 
* Also sets alert with AlarmManager. 
*/ 
public void saveAlarm() { 
    // Create Database instance 
    DbHandler db = new DbHandler(getApplicationContext()); 

    if(alarm.getId() == -1) { 
     // Saving a new alarm 
     db.open(); 
     alarm.setId(db.addAlarm(alarm)); 
     db.close(); 
    } 
    else { 
     db.open(); 
     db.updateAlarm(alarm); 
     db.close(); 
    } 

    // Create the wakeup intent 
    Intent intent = new Intent(this, AlarmReceiver.class); 
    intent.putExtra("alarm_id", alarm.getId()); 

    // Create the Pending Intent 
    PendingIntent sender = PendingIntent.getBroadcast(this, AlarmPlayer.REQUEST_ALARM + alarm.getId(), intent, PendingIntent.FLAG_UPDATE_CURRENT); 

    // Debug 
    Calendar now = Calendar.getInstance(); 
    long dTime = alarm.getNextAlarmTime().getTimeInMillis() - now.getTimeInMillis(); 
    Log.d(TAG, "Setting alarm for " + (dTime/1000) + " seconds time"); 

    // Add to Android Alarm Manager 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
    am.set(AlarmManager.RTC_WAKEUP, alarm.getNextAlarmTime().getTimeInMillis(), sender);  
} 

나는 정확한 시간이 am.set (위의 디버그 섹션 참조)에 전달되는 것을 확인했습니다.


AlarmReceiver.class

/** 
* This class listens out for broadcasts from AlarmManager 
* and launches the AlarmPlayer activity accordingly. 
* @author Michael 
* 
*/ 
public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context c, Intent intent) { 
     Log.d("RSS Alarm", "Waking up alarm"); 
      // Launch the AlarmPlayer activity 
     Intent i = new Intent(c, AlarmPlayer.class); 
     i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     c.startActivity(i); 
    } 

} 

I도있다 [수신기 로이드 : 프로세스 = "원격"로이드 이름 = "AlarmReceiver"/ (직각 사각형 대체 을 대괄호)이 AndroidManifest.xml에 설정되었습니다. 그럼에도 불구하고이 문제의 원인을 알 수는 없지만 그래도 문제가 발생합니다. 어떤 도움이라도 대단히 감사하겠습니다. 미리 감사드립니다.


편집 한 은 UTC로 시간대 아무것도 해결하지 않는 것 변경, 내 캘린더에 관계없이 UTC를 기본값으로 보인다. 현재 코드 :

// Debug 
Calendar now = Calendar.getInstance(TimeZone.getTimeZone("UTC")); 
long dTime = alarm.getNextAlarmTime().getTimeInMillis() - now.getTimeInMillis(); 
Log.d(TAG, "Setting alarm for " + (dTime/1000) + " seconds time"); 

// Add to Android Alarm Manager 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
Log.d(TAG, "Timezone offset is " + TimeZone.getDefault().getRawOffset()); 
Log.d(TAG, "UTC time is currently " + Calendar.getInstance(TimeZone.getTimeZone("UTC")).getTimeInMillis()/1000); 
am.set(AlarmManager.RTC_WAKEUP, (alarm.getNextAlarmTime().getTimeInMillis() - TimeZone.getDefault().getRawOffset()), sender); 

답변

0

AlarmManager.set(AlarmManager.RTC_WAKEUP, ...)은 UTC로 시간이 필요합니까? 이것은 '현지 시간'을 설정하고 UTC로 조정하지 않으면 문제가 발생합니다. 간단히 말해서 알람이 제대로 추가되고있을 수 있지만 시간대가 UTC가 아닌 경우 알람을 예상 할 때 트리거되지 않습니다. 워드 프로세서

...

공공 정적 최종 INT의 RTC_WAKEUP 가입일 : API 레벨에 System.currentTimeMillis 1

알람 시간() (UTC에서 벽 시계 시간), 윌 기기가 꺼지면 기기를 깨우십시오.

+0

실례가 안됩니다. 내 달력은 UTC에 상관없이 기본값으로 설정됩니다 (아래 편집 1의 코드를 사용하여 디버깅하면 "시간대 오프셋은 0입니다"라는 메시지가 표시됨). 그것이 당신이 제기 한 좋은 점 (감사)이지만,이 문제를 해결하지는 못합니다. –

+0

OK, UTC 요구 사항과 관련된 문제가있는 곳에서 몇 가지 질문을 보았습니다.내가 생각할 수있는 유일한 다른 점은 일광 절약 시간제를 고려한 것입니다. 로케일에 대한 시간대 오프셋은 일정하며 DST 변화에 따라 달라지지 않습니다. 그게 범인이 아니라면, 다른 어떤 것도 생각할 수 없습니다. 미안 해요. – Squonk

+0

그래, 시간 계산 문제로 밝혀졌습니다. 건전한 AlarmManager.set (.. 섹션을 다시 작성했는데 모두 정상적으로 작동합니다. 건배 –

0

귀하의 매니페스트에서 나는 android가 필요하다고 생각합니다 : name ".AlarmReceiver"는 점을 적어 두십시오. 그렇게하지 않으면 매니페스트 파일을 게시하십시오. 또한, 귀하의 logcat 언급 경보 및 경보 트리거링을 추가합니까?

편집 : 시도해보십시오 AlarmManager am = (AlarmManager) getSystemService (Context.ALARM_SERVICE);

그 외, 나는 나와 밖으로 뛰지 않는 것을 볼 수 없습니다. 행운을 빌어 요.

+0

이 문제의 더 기괴한 측면 중 하나입니다. AlarmManager 나 Log notes I 이외의 다른 언급이 없습니다. 코드에 남았습니다. 지금 매니페스트를 게시 할 것입니다. –

관련 문제