현재 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);
실례가 안됩니다. 내 달력은 UTC에 상관없이 기본값으로 설정됩니다 (아래 편집 1의 코드를 사용하여 디버깅하면 "시간대 오프셋은 0입니다"라는 메시지가 표시됨). 그것이 당신이 제기 한 좋은 점 (감사)이지만,이 문제를 해결하지는 못합니다. –
OK, UTC 요구 사항과 관련된 문제가있는 곳에서 몇 가지 질문을 보았습니다.내가 생각할 수있는 유일한 다른 점은 일광 절약 시간제를 고려한 것입니다. 로케일에 대한 시간대 오프셋은 일정하며 DST 변화에 따라 달라지지 않습니다. 그게 범인이 아니라면, 다른 어떤 것도 생각할 수 없습니다. 미안 해요. – Squonk
그래, 시간 계산 문제로 밝혀졌습니다. 건전한 AlarmManager.set (.. 섹션을 다시 작성했는데 모두 정상적으로 작동합니다. 건배 –