Android-OneoffTask.Builder中意外的setExecutionWindow()行为

Android-OneoffTask.Builder中意外的setExecutionWindow()行为,android,android-service,Android,Android Service,我正在创建一个gcmtasksservice,我用OneoffTask调用它 我不确定传递给OneoffTask.Builder的setExecution()方法的windowEndDelaySeconds值是否正确使用。或许我只是不明白: public OneoffTask.Builder setExecutionWindow(长窗口开始延迟秒,长窗口结束延迟秒) 用于创建一次性任务的强制设置器。您可以指定最早的 您的任务可能从未来的某个时间点开始 正在执行,以及未来的最新时间点 你的任务一定

我正在创建一个
gcmtasksservice
,我用
OneoffTask
调用它

我不确定传递给
OneoffTask.Builder的
setExecution()
方法的
windowEndDelaySeconds
值是否正确使用。或许我只是不明白:

public OneoffTask.Builder setExecutionWindow(长窗口开始延迟秒,长窗口结束延迟秒)

用于创建一次性任务的强制设置器。您可以指定最早的 您的任务可能从未来的某个时间点开始 正在执行,以及未来的最新时间点 你的任务一定已经执行了

参数

WindowsStartDelaySeconds—任务有资格运行的最早时间点。windowEndDelaySeconds-最新时间点 必须运行的任务

当我执行以下操作时:

  • 禁用设备上的连接
  • 使用
    .setExecutionWindow(0,1)
  • 等10秒钟
  • 在我的设备上启用连接
  • …我的任务执行-尽管它比我在
    OneoffTask.Builder
    中指定的1秒
    windowEndDelaySeconds
    值要晚得多。为什么会这样

    我的代码

    import android.content.Context;
    import android.os.Bundle;
    import android.util.Log;
    import com.google.android.gms.gcm.GcmNetworkManager;
    import com.google.android.gms.gcm.GcmTaskService;
    import com.google.android.gms.gcm.OneoffTask;
    import com.google.android.gms.gcm.Task;
    import com.google.android.gms.gcm.TaskParams;
    
    public class TestTaskService extends GcmTaskService {
    
        private final static String LOG_TAG = TestTaskService.class.getSimpleName();
        private static final String ACTION_TEST = "ACTION_TEST";
        private static final String EXTRA_ACTION = "EXTRA_ACTION";
        private static final String EXTRA_MESSAGE = "EXTRA_MESSAGE";
    
        public static void startActionTest(Context context, String message) {
    
            Bundle extras = new Bundle();
            extras.putString(EXTRA_ACTION, ACTION_TEST);
            extras.putString(EXTRA_MESSAGE, message);
    
            OneoffTask task = new OneoffTask.Builder()
                    .setService(TestTaskService.class)
                    .setExtras(extras)
                    .setTag(ACTION_TEST)
                    .setExecutionWindow(0, 1) // seconds
                    .setRequiredNetwork(Task.NETWORK_STATE_CONNECTED)
                    .setPersisted(true)
                    .setUpdateCurrent(true)
                    .build();
    
            GcmNetworkManager gcmNetworkManager = GcmNetworkManager.getInstance(context);
            gcmNetworkManager.schedule(task);
    
        }
    
        @Override
        public int onRunTask(TaskParams taskParams) {
    
            Context context = getApplicationContext();
            Bundle extras = taskParams.getExtras();
            String action = extras.getString(EXTRA_ACTION);
            if (ACTION_TEST.equals(action)) {
    
                String message = extras.getString(EXTRA_MESSAGE);
                if (message == null) {
                    message = "No message.";
                }
                Utilities.makeToast(context, message);
                return GcmNetworkManager.RESULT_SUCCESS;
            }
            else {
                Log.e(LOG_TAG, "Unknown action: " + action);
                Utilities.makeToast(context, "Unknown action: " + action);
                return GcmNetworkManager.RESULT_FAILURE;
            }
    
        }
    
    }
    

    …通过
    TestTaskService.startActionTest(上下文,“我的消息”)调用

    给定
    start=600
    end=3600
    一旦满足条件(例如,所需的连接),作业将在10分钟到1小时之间运行,如果不满足条件,则从现在开始运行1小时。作业运行时,由您确定是哪一个或检查条件

    因此,如果在
    end
    之前未满足条件,则作业根本不应运行的相反观点是错误的

    网络连接时安排一次性任务 为了保存用户的数据,您的应用程序可以安排仅在用户连接到未计量(非蜂窝)网络时执行一次性任务。下面的示例显示了一个任务,该任务将在用户有未计量的连接时立即执行,或最迟在计划后一小时执行:

    OneoffTask task = new OneoffTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_WIFI)
        .setExecutionWindow(0L, 3600L)
        .setRequiredNetwork(Task.NETWORK_STATE_UNMETERED)
        .build();
    
    mGcmNetworkManager.schedule(task);
    

    来源:

    给定
    start=600
    end=3600
    一旦满足条件(例如,所需的连接),作业将在10分钟到1小时之间运行,如果不满足条件,则从现在开始运行1小时。作业运行时,由您确定是哪一个或检查条件

    因此,如果在
    end
    之前未满足条件,则作业根本不应运行的相反观点是错误的

    网络连接时安排一次性任务 为了保存用户的数据,您的应用程序可以安排仅在用户连接到未计量(非蜂窝)网络时执行一次性任务。下面的示例显示了一个任务,该任务将在用户有未计量的连接时立即执行,或最迟在计划后一小时执行:

    OneoffTask task = new OneoffTask.Builder()
        .setService(MyTaskService.class)
        .setTag(TASK_TAG_WIFI)
        .setExecutionWindow(0L, 3600L)
        .setRequiredNetwork(Task.NETWORK_STATE_UNMETERED)
        .build();
    
    mGcmNetworkManager.schedule(task);
    

    来源:

    您没有提到预期的行为。是否是“如果在
    windowEnd
    之前未满足条件,则根本不运行任务”?文档将结束时间描述为任务必须运行的
    最晚点。因此,我希望如果我的任务在1秒后没有运行,那么它将根本不会运行。但事实并非如此,那么有人能对
    windowEndDelaySeconds
    参数提供更好/更全面的解释吗?您没有提到预期的行为。是否是“如果在
    windowEnd
    之前未满足条件,则根本不运行任务”?文档将结束时间描述为任务必须运行的
    最晚点。因此,我希望如果我的任务在1秒后没有运行,那么它就根本不会运行。但事实并非如此,那么有人能对
    windowEndDelaySeconds
    参数提供更好/更全面的解释吗?谢谢,但如果是这样,那么我的任务应该在调度后1秒运行(由于到达了结束时间,但条件尚未满足)。但它只运行了一段时间(很晚)当满足条件时。您确定不是这种行为吗?
    请注意,您可以在将来的任何时候请求执行一次性任务,但为了防止滥用,计划程序只会在未来至少30秒设置警报。如果发生网络事件唤醒sch,您的任务仍可以在此之前运行eduler.
    来源:这里的情况似乎不是这样。即使我引入了步骤3a-重新启动设备,我也会得到与我在问题中描述的相同的结果。请尝试一下我的代码,你应该自己看看。谢谢。奇怪的文档。这是否意味着即使条件不满足,任务也会在1小时后执行met?我不这么认为。@malachiasz这是根据文档发生的事情。你负责检查任务开始时的条件。然后做出相应的反应。如果条件满足,就做工作,或者重新安排任务。或者调整工作量,我不知道你的特定用例。谢谢,但是如果是这样的话,我会y任务应该在计划后1秒运行(因为已达到结束时间,但条件未满足)。但它只运行了(很晚)当满足条件时。您确定不是这种行为吗?
    请注意,您可以在将来的任何时候请求执行一次性任务,但为了防止滥用,计划程序只会在未来至少30秒设置警报。如果发生网络事件唤醒sch,您的任务仍可以在此之前运行eduler.
    Source:这里的情况似乎不是这样。我得到的结果与我在问题中描述的结果相同,即使我引入了步骤3a-重新启动设备