AlarmManager.RTC не работает? - PullRequest
3 голосов
/ 03 марта 2010

Я немного изменил AlarmController.java в ApiDemo, поэтому я хочу, чтобы будильник не выключался, когда телефон спит, с помощью AlarmManager.RTC.

        Intent intent = new Intent(AlarmController.this, RepeatingAlarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
                0, intent, 0);

        // We want the alarm to go off 30 seconds from now.
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 15*1000;

        // Schedule the alarm!
        AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
        am.setRepeating(AlarmManager.RTC, //AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        firstTime, 15*1000, sender);

Код получателя как ниже:

public class RepeatingAlarm extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("DEBUG", "In RepeatingAlarm.onReceive, intent=" + intent);
        Toast.makeText(context, R.string.repeating_received, Toast.LENGTH_SHORT).show();
    }
}

Я запустил измененное приложение, но я все еще вижу много сообщений в журнале, как показано ниже, после того, как телефон перестал спать (экран был черным):

D / DEBUG (1390): в RepeatingAlarm.onReceive intent = Intent {flg = 0x4 cmp = com.example.android.apis / .app.RepeatingAlarm (имеет дополнительные функции)}

Это означает, что флаг AlarmManager.RTC не работал. Может кто-нибудь сказать мне, почему?

Спасибо.

1 Ответ

8 голосов
/ 03 марта 2010

Поскольку вы используете elapsedRealtime для получения времени начала тревоги, я думаю, вам нужно использовать флаг ELAPSED_REALTIME вместо флага RTC.

Я предполагаю, что диспетчер аварийных сигналов думает, что пропустил тонну аварийных сигналов, поскольку вы используете флаг RTC, что означает, что диспетчер аварийных сигналов ожидает, что вы отправите значение времени в миллисекундах с 1 января 1970 г., но вместо этого вы отправляете истекшие миллисекунды с момента загрузки устройства, что будет намного меньшим числом.

Если вы используете флаги RTC, вам нужно использовать System.currentTimeMillis () или получить время в миллисекундах от объекта Java Date или Calendar. Если вы используете флаги ELAPSED_REALTIME, вам нужно использовать SystemClock.elapsedRealtime ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...