Может кто-нибудь объяснить это странное поведение AlarmManeger? - PullRequest
0 голосов
/ 24 апреля 2011

Ниже приведена простая процедура вызова тревоги, запишите количество форели, которую я хочу поймать:

    private void setReminder() {
        Intent intent = new Intent(this, AlarmReceiver5.class);
        int trout = 21;
        intent.putExtra("intData", trout);
        intent.putExtra("textData", 
            "Great day for fishing! How many trout you want to get today? ");
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);

        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15 * 1000, sender);
    }
  1. Когда я запускаю его впервые, BroadcastReceiver правильно видит, что я хочу поймать 21 форель сегодня.

  2. Я изменил номер на 22 в Eclipse, запустил его снова, получатель все еще видит 21! Независимо от того, как я пытаюсь здесь, включая удаление программы из Android, получатель всегда получает старый номер.

  3. Теперь, если я переименую класс получателя из AlarmReceiver5 в AlarmReceiver6, тогда он может успешно получить другой номер. Но затем произошло то же самое, то есть независимо от того, как я изменил номер, получатель всегда получает старый номер, пока я не переименую класс.

  4. Однако, если я изменю имена элементов в Bundle (т. Е. «IntData» и «textData» в приведенном выше примере), получатель вообще ничего не сможет получить! Число становится 0. Конечно, я обновил сторону получателя соответственно.

  5. Вышесказанное верно, даже если я использовал классы ApiDemo AlarmController и OneShotAlarm.

Теперь, если я немного подправлю код, я отменил будильник перед установкой следующего будильника, тогда получатель ничего не получает, число равно 0. См. Код ниже:

    private void setReminder() {
        AlarmManager am = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlarmReceiver5.class);
        // Cancel the alarm
        PendingIntent sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        am.cancel(sender);

        // Then set it again (using a newly created PendingIntent).
        sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        int trout = 21;
        intent.putExtra("intData", trout);
        intent.putExtra("textData", 
        "Great day for fishing! How many trout you want to get today? ");
        sender = PendingIntent.getBroadcast(this, 0, intent, 0);
        am.cancel(sender);
        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 15 * 1000, sender);
}

Может кто-нибудь объяснить, что думает взломанный Android AlarmManager? Спасибо! (Возможно, я не смогу увидеть ваш ответ в течение нескольких часов, потому что я отправляюсь на рыбалку после публикации этого сообщения.)

1 Ответ

1 голос
/ 24 апреля 2011

в PendingIntent.getBroadcast (this, 0, intent, 0);установите параметр флага (4-й) на одну из констант в http://developer.android.com/reference/android/app/PendingIntent.html

...