Android WakefulIntentService在调度后立即启动

Android WakefulIntentService在调度后立即启动,android,commonsware-cwac,Android,Commonsware Cwac,我试图在一个新的应用程序中使用Commonware的WakefulIntentService,特别是它能够轻松地安排intent服务在以后运行 我有一个PreferenceActivity,允许用户选择服务运行的时间表(例如每天早上5点)。一旦用户更改了首选项值,我调用: AutoDownloadIntentServiceAlarmListener alarmListener = new AutoDownloadIntentServiceAlarmListener(); alarmListene

我试图在一个新的应用程序中使用Commonware的WakefulIntentService,特别是它能够轻松地安排intent服务在以后运行

我有一个PreferenceActivity,允许用户选择服务运行的时间表(例如每天早上5点)。一旦用户更改了首选项值,我调用:

AutoDownloadIntentServiceAlarmListener alarmListener = new AutoDownloadIntentServiceAlarmListener();
alarmListener.setForcedHour(5);  // we want to schedule alarm for 5am everyday.

WakefulIntentService.scheduleAlarms(alarmListener, this, true);
出于某种原因,所需的IntentService(扩展WakefulIntentService)立即启动并执行其工作

以下是AutoDownloadIntentServiceAlarmListener的实现:

public class AutoDownloadIntentServiceAlarmListener implements WakefulIntentService.AlarmListener {

private static final String TAG = "AutoDownloadIntentServiceAlarmListener";
    private int mForcedHour = -1;

    @Override
    public long getMaxAge() {
        return AlarmManager.INTERVAL_DAY * 2;
    }

    public void setForcedHour(int forcedHour) {
        mForcedHour = forcedHour;
    }

    @Override
    public void scheduleAlarms(AlarmManager alarmManager, PendingIntent pendingIntent, Context context) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        String autoDownloadTimePref = MyApplication.getInstance().getPrefs().getString("autoDownloadEpisodesSchedule", "0");

        int hourOfAlarm = Integer.parseInt(autoDownloadTimePref);
            // if this class has been created with a specific hour
            // use it instead of the value obtained from SharedPreferences above.
        if (mForcedHour > -1) {
            Log.w(TAG, "Forced hour has been set for this AlarmListener. " + mForcedHour);
            hourOfAlarm = mForcedHour;
        }
        calendar.set(Calendar.HOUR_OF_DAY, hourOfAlarm);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);

        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);

        Log.d(TAG, String.format("Scheduled inexact alarm for %d", hourOfAlarm));
    }

    @Override
    public void sendWakefulWork(Context context) {
        Intent serviceIntent = new Intent(context, AutoDownloadIntentService.class);

        WakefulIntentService.sendWakefulWork(context, serviceIntent);
    }

}
我的意图是,该服务不会按计划立即启动,而是只在第二天早上5点启动。(并继续无限期地重复此计划,或直到用户选择禁用或更改其计划)

我做错了什么

我的意图是,该服务不会按计划立即启动,而是只在第二天早上5点启动

但这不是你的代码做的,大约80%的时间。你的代码说它应该在今天早上5点运行,因为你得到的是当前时间,而不是改变一天。大多数情况下,今天上午5点已经过去,因此
AlarmManager
将立即开始工作

您需要查看您计算的
日历是否比现在旧,如果是,请添加一天

我的意图是,该服务不会按计划立即启动,而是只在第二天早上5点启动

但这不是你的代码做的,大约80%的时间。你的代码说它应该在今天早上5点运行,因为你得到的是当前时间,而不是改变一天。大多数情况下,今天上午5点已经过去,因此
AlarmManager
将立即开始工作


您需要查看您计算的
日历是否比现在旧,如果是,请添加一天。

谢谢您的解释。如何计算“日历”是否比现在旧?加上一天?@stanleysantoso:Um,
日历
before()
after()
两种比较方法。谢谢。现在我有点糊涂了。喂,现在是晚上10点。警报设置为晚上8点,即22.00。晚上8点在当前时间之前。这意味着它将被添加到一天?哪一个是24小时?所以新的警报将设置为46.00??这就是它的工作原理吗?谢谢你的解释。如何计算“日历”是否比现在旧?加上一天?@stanleysantoso:Um,
日历
before()
after()
两种比较方法。谢谢。现在我有点糊涂了。喂,现在是晚上10点。警报设置为晚上8点,即22.00。晚上8点在当前时间之前。这意味着它将被添加到一天?哪一个是24小时?所以新的警报将设置为46.00??这就是它的工作原理吗?