AlarmManager не добавляет новые сигналы тревоги или не запускает приемник

1

В настоящее время я разрабатываю приложение, которое использует 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

2 ответа

0
Лучший ответ

Возможно ли, что AlarmManager.set(AlarmManager.RTC_WAKEUP,...) требует времени в UTC? Это вызывает проблемы, если вы устанавливаете "местное время" и не настраиваетесь на UTC. Короче говоря, будильник может быть правильно добавлен, но он не срабатывает, если вы ожидаете его, если ваш часовой пояс не является UTC.

Из документов...

public static final int RTC_WAKEUP С: API уровня 1

Время будильника в System.currentTimeMillis() (время настенных часов в UTC), которое пробудит устройство, когда оно погаснет.

  • 0
    Боюсь, не работает. Оказывается, мои календари по умолчанию установлены в UTC (отладка с использованием кода в редактировании 1 ниже дает сообщение «Смещение часового пояса равно 0»). Хотя это хороший момент, который вы подняли (спасибо), это не решает эту проблему.
  • 0
    Хорошо, это стоило попробовать, так как я видел несколько вопросов здесь о SO, где проблемы, связанные с требованием UTC. Единственное, о чем я могу подумать (и должен был упомянуть), это также учитывать летнее время - смещение часового пояса для региона постоянно и не меняется в зависимости от летнего времени. Если это не виновник, то я не могу думать ни о чем другом, извините.
Показать ещё 1 комментарий
0

В вашем манифесте я считаю, что вам нужен андроид: имя ".AlarmReceiver" отмечает точку. Если это не так, отправьте свой файл манифеста. Кроме того, указывает ли ваш лог-код добавить будильник и тревогу?

Изменение: вы можете попробовать этот AlarmManager am = (AlarmManager) getSystemService (Context.ALARM_SERVICE);

Кроме этого, я не вижу ничего, что выпрыгивает из меня. Удачи

  • 0
    Это один из самых причудливых аспектов этой проблемы - там нет упоминания о AlarmManager или чего-либо подобного, кроме записей в журнале, которые я оставил в коде. Разместим манифест сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню