В настоящее время я разрабатываю приложение, которое использует Android AlarmManager. Я пытаюсь добавить новый будильник в AlarmManager, но после нескольких часов работы с различными вещами и проверки различных потоков на SO я все еще на кирпичной стене. Есть ли проблемы с моим кодом?
Основная активность - функция 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);
}
}
У меня также есть [receiver android: process = ": remote" android: name = "AlarmReceiver"/] (заменить квадрат угловыми скобками), установленный в AndroidManifest.xml. Я понятия не имею, что вызывает эту проблему, но тем не менее это происходит. Любая помощь будет принята с благодарностью, большое спасибо заранее.
Изменить 1 Изменение часового пояса на 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);
Возможно ли, что AlarmManager.set(AlarmManager.RTC_WAKEUP,...)
требует времени в UTC? Это вызывает проблемы, если вы устанавливаете "местное время" и не настраиваетесь на UTC. Короче говоря, будильник может быть правильно добавлен, но он не срабатывает, если вы ожидаете его, если ваш часовой пояс не является UTC.
Из документов...
public static final int RTC_WAKEUP С: API уровня 1
Время будильника в System.currentTimeMillis() (время настенных часов в UTC), которое пробудит устройство, когда оно погаснет.
В вашем манифесте я считаю, что вам нужен андроид: имя ".AlarmReceiver" отмечает точку. Если это не так, отправьте свой файл манифеста. Кроме того, указывает ли ваш лог-код добавить будильник и тревогу?
Изменение: вы можете попробовать этот AlarmManager am = (AlarmManager) getSystemService (Context.ALARM_SERVICE);
Кроме этого, я не вижу ничего, что выпрыгивает из меня. Удачи