我的代码
public class BackgroundIntentService extends IntentService {
public BackgroundIntentService() {
super("BackgroundIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
scheduleNextUpdate();
Log.w("Blabla", "asldad111");
Log.w("Blabla", "asldad");
Log.w("Blabla", "asldad");
Log.w("Blabla", "asldad555");
}
private void scheduleNextUpdate() {
Intent intent = new Intent(this, this.getClass());
PendingIntent pendingIntent =
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// The update frequency should often be user configurable. This is not.
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 5000, pendingIntent);
}
}
启动服务
Intent serviceIntent = new Intent(this, BackgroundIntentService.class);
startService(serviceIntent);
在MainActivity中。
问题是我可以在logcat中看到那些垃圾邮件,不是每5秒钟,而是每秒两次或更多。
我哪里错了?
答案 0 :(得分:1)
您在
中使用PendingIntent.FLAG_UPDATE_CURRENT
的旗帜
PendingIntent pendingIntent =
PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
应为PendingIntent.FLAG_CANCEL_CURRENT
FLAG_CANCEL_CURRENT - 表示如果描述的PendingIntent已经存在的标志,则应在生成新的PendingIntent之前取消当前的PendingIntent。
FLAG_UPDATE_CURRENT - 表示如果描述的PendingIntent已经存在的标志,则保留它,但将其额外数据替换为此新Intent中的内容。
因此,在您的情况下,当前待处理的意图存在,并且新的更新它并在更新现有挂起的确切时刻触发,因为您已将触发时间定义为 System.currentTimeMillis()强>
所以正在发生的事情是当前Pending意图在新的待定意图更新之前启动..并且一旦它按照警报逻辑工作,在5000ms间隔之后触发挂起的意图。所以这里有一个竞争条件,有交错的警报触发器和通过挂起的意图更新。