Android alarmmanager не очень надежный - PullRequest
4 голосов
/ 28 января 2011

У меня проблема с функциями Alarmmanager для Android.

Проблема заключается в том, что аварийные сигналы, для которых требуется более часа ожидания, не срабатывают.

Мое приложение изначально создает аварийный сигнал, например: -

PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
             am.set(AlarmManager.RTC_WAKEUP, mCal.getTimeInMillis(), sender);

Когдасигнал тревоги гаснет, и запускается мой класс RecieverHandler, а именно эта функция: -

public void onReceive(Context context, Intent intent) 
    {
        try {
             Bundle bundle = intent.getExtras();


             Intent newIntent = new Intent(context, MessageDispatcher.class);
             newIntent.putExtras(bundle);
            // newIntent.addFlags(Intent.FLAG);
             context.startService(newIntent);



            } catch (Exception e) {
             Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
             e.printStackTrace();

            }


    }

Затем запускается служба с именем MessageDispatcher и вызывается эта функция: -

public int onStartCommand(Intent intent, int flags, int startId)

Эта функция получает следующий сигнал тревоги из моей базы данных, это, я уверен, работает правильно, затем она устанавливает новый сигнал тревоги на основе даты из базы данных следующим образом: -

PendingIntent sender = PendingIntent.getBroadcast(this, 192837, newIntent, PendingIntent.FLAG_UPDATE_CURRENT);


    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, mCal.getSendAt().getTimeInMillis(), sender);

Это создает сигнал тревоги дляследующее сообщение.

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

Затем, когда этот сигнал тревоги сработает, он получит следующий сигнал тревоги и запланирует его.Я почти на 100% уверен, что эти части работают нормально.

Так что я застрял только с некоторыми теориями, почему он не работает.

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

Итак, моя основная теория заключается в том, что созданный мной менеджер сигналов тревоги удаляется через определенное время?Если это правда, то это большая проблема, поскольку мне нужно, чтобы это работало независимо от того, сколько времени прошло.

Любая помощь в обеспечении того, чтобы моя тревога оставалась, очень ценится, спасибо.

1 Ответ

2 голосов
/ 28 января 2011

Итак, моя основная теория заключается в том, что созданный мной менеджер аварийных сообщений удаляется через определенное время?

Зарегистрированные тревоги остаются зарегистрированными до тех пор, пока вы не отмените их, или до следующей перезагрузки, или до тех пор, пока пользователь не убьет ваше приложение «убийцей задач» на Android 2.1 и более ранних версиях.

Вы не указали:

  • как вы определяете, сработал ли будильник
  • что BroadcastReceiver делает

Без этой информации невозможно сказать, куда вы идете не так.

Убедитесь, что либо вы выполняете всю свою работу в BroadcastReceiver (если работа выполняется очень быстро), либо сохраняете свой собственный WakeLock, передавая управление IntentService, выполняющему остальное работы. Проверьте WakefulIntentService для более.

Кроме того, вы можете попытаться создать уникальный Intents для каждой тревоги, а не обновлять текущую на месте. Я не знаю, что здесь есть какая-то особая проблема, но это заставляет меня нервничать.

...