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

Это один из самых странных случаев, которые я видел.

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

public static final int INTERVAL_SECONDS = 300;

public void SetAlarm(Context context)
{
    AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
    Intent i = new Intent(context, Alarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * INTERVAL_SECONDS, pi); // Millisec * Second * Minute
}

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

 @Override
 public void onReceive(Context context, Intent intent) 
 {   
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();

    Intent pper = new Intent(context, PushPullService.class);
    context.startService(pper);
    Log.d("AlarmReceiver", "Called context.startService from AlarmReceiver.onReceive");

    wl.release();
 }

Мое приложение имеет следующие разрешения в манифесте:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

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

Есть события (печать в лог в начале процедуры интента) каждые 5 минут, но иногда я не вижу ничего в лог-файле какое-то время, а потом вижу много событий сразу. Количество событий, которые выполняются вместе (одно за другим), кажется, является количеством событий, которые, как я ожидаю, появятся в течение периода времени, когда ни одно событие не было запущено.

Любой совет? Что бы это могло быть? Я не нашел никаких доказательств такого поведения. Может быть, это что-то в моем собственном устройстве?

РЕДАКТИРОВАТЬ: я добавил отпечаток в журнал, когда был запущен широковещательный приемник. Увидел, что трансляция принимается каждые пять минут, но интент не запускается!

Я также добавил уникальный идентификатор для каждого намерения, как это было предложено Ирфаном Ахмедом, но это не решило проблему:

 Intent i = new Intent(context, Alarm.class);
 i.setData(Uri.parse(String.valueOf(System.currentTimeMillis())));
 PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, Intent.FLAG_GRANT_READ_URI_PERMISSION);

person Gari BN    schedule 19.12.2013    source источник
comment
Я думаю, проблема была в широковещательном приемнике, можете ли вы опубликовать класс широковещательного приемника и файл манифеста.   -  person Harshid    schedule 19.12.2013
comment
Вы смогли решить свою проблему? у меня похожая проблема не могу найти решение   -  person Marty    schedule 07.11.2015


Ответы (1)


вам нужно установить уникальный идентификатор для каждого будильника здесь.

во-первых, проверьте свой манифест, он выглядит так,

<receiver android:name="com.example.Somename.Alarm" >
    <intent-filter>
        <data android:scheme="timer:" />
    </intent-filter>
</receiver>

Затем в вашем методе setAlarm

Intent i = new Intent(context, Alarm.class);
i.setData(Uri.parse("timer:" + uniqueId));
PendingIntent pi = PendingIntent.getBroadcast(context, uniqueId, i, Intent.FLAG_GRANT_READ_URI_PERMISSION);

Создайте уникальный идентификатор из метки времени или что-то еще,

ИЗМЕНИТЬ

При установке будильника с помощью

am.setRepeating()

это фактически присваивает это pendingIntent ОС, и вы добавляете 300 секунд к текущему времени, а затем ровно через пять минут ваш приемный вызов и вы получаете уведомление...

person Irfan Ahmed    schedule 19.12.2013
comment
Почему это имеет значение? Что мне дает уникальный идентификатор. Думаете, я получаю эфир каждые пять минут, а интент не срабатывает? Если да, то что именно происходит (кто запускает намерение позже)? - person Gari BN; 19.12.2013
comment
используя уникальный идентификатор, вы можете установить разные будильники, которые не будут перезаписываться друг другом. - person Irfan Ahmed; 19.12.2013
comment
Android повторно использует ожидающие намерения, переписывая полезную нагрузку, которую они несут. Ирфан прав, вы должны использовать уникальные идентификаторы при создании намерений, чтобы предотвратить переопределение. У меня тоже была эта проблема в прошлом. - person Cristian Holdunu; 19.12.2013
comment
КОММЕНТАРИЙ: Где я должен разместить эти строки? В SetAlarm или в onRecieve? Поскольку вы упомянули pendingIntent, я поместил их в метод SetAlarm, и он не работает. См. редакцию вопроса для получения новых подробностей. - person Gari BN; 19.12.2013
comment
Я полагал, вы могли бы понять эту идею, во всяком случае, я собираюсь обновить свой ответ! - person Irfan Ahmed; 19.12.2013