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-重新启动设备