Android - 后台服务经常运行

时间:2015-04-08 19:13:46

标签: android service alarmmanager background-service

我的代码

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秒钟,而是每秒两次或更多。

我哪里错了?

1 个答案:

答案 0 :(得分:1)

您在

中使用PendingIntent.FLAG_UPDATE_CURRENT的旗帜
PendingIntent pendingIntent =
            PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

应为PendingIntent.FLAG_CANCEL_CURRENT

引用developer docs

  

FLAG_CANCEL_CURRENT - 表示如果描述的PendingIntent已经存在的标志,则应在生成新的PendingIntent之前取消当前的PendingIntent。

     

FLAG_UPDATE_CURRENT - 表示如果描述的PendingIntent已经存在的标志,则保留它,但将其额外数据替换为此新Intent中的内容。

因此,在您的情况下,当前待处理的意图存在,并且新的更新它并在更新现有挂起的确切时刻触发,因为您已将触发时间定义为 System.currentTimeMillis()

所以正在发生的事情是当前Pending意图在新的待定意图更新之前启动..并且一旦它按照警报逻辑工作,在5000ms间隔之后触发挂起的意图。所以这里有一个竞争条件,有交错的警报触发器和通过挂起的意图更新。