Это один из самых странных случаев, которые я видел.
У меня есть приложение, которое выполняет какую-то задачу каждые 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);