【问题标题】:Force execution of GCMNetworkManager OneoffTask in Android在 Android 中强制执行 GCMNetworkManager OneoffTask
【发布时间】:2015-09-23 03:39:45
【问题描述】:
我正在使用 GcmNetworkManager 来安排 OneoffTask,其执行窗口从 0 开始。在 documentations 中提到
请注意,您可以请求在未来任何时候执行一次性任务,但为防止滥用,调度程序只会在未来至少 30 秒设置警报。如果发生某些网络事件来唤醒调度程序,您的任务仍然可以在此之前运行。
这对我来说是有问题的,因为我必须等待 30 秒才能执行任务,而我希望它在可能的情况下立即执行。有什么方法可以实现吗?
【问题讨论】:
标签:
android
google-cloud-messaging
【解决方案1】:
有一种方法可以实现强制立即执行任何任务。
虽然下面的方法乍一看似乎是糟糕的代码,但在使用 GcmNetworkManager 编写后台数据同步代码后,大多数开发人员希望在应用程序处于前台时重用同一段代码。为什么任何应用都应该有一个 GcmTskService 和一个 AsyncTask/IntentService,都调用同一个数据同步 API 端点?
我遇到了同样的问题,使用下面的代码sn-p-实现了一次性任务的立即执行
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && MY_ACTION.equals(intent.getAction())) {
Log.v(LOG_TAG, "onStartCommand - called by our code);
if (network-is-connected)) {
// do below calls in run method of a thread
TaskParams taskParams = new TaskParams(TASK_TAG);
int result = onRunTask(taskParams);
if (result == GcmNetworkManager.RESULT_RESCHEDULE) {
// schedule task
}
stopSelf();
// thread's run end
} else {
// schedule task
stopSelf();
}
return START_NOT_STICKY;
} else {
Log.v(LOG_TAG, "onStartCommand - called by GCM Nw Mngr");
// call super so that GCM's code may run as it was intended
return super.onStartCommand(intent, flags, startId);
}
}
【解决方案2】:
您的意思是您希望能够强制执行以调试您的 OneoffTask?
目前您无法触发之前计划的任务。但是,您可以运行一个 adb shell 命令来触发具有特定标记的特殊一次性调试任务。 documentation on GcmNetworkManager 有详细信息。
或者您的意思是您希望 OneoffTask 能够立即运行?
不幸的是,如果没有一些事件除了警报来唤醒网络管理员,这是不可能的。 GNM 当前的工作方式是将客户端调用 schedule(Task) 视为唤醒(或任何其他 API 调用)。
如果您安排了您的任务,然后在第二次“安排”调用后不久安排了另一个任务,则可能会使 GNM 运行第一次。这是未记录的,不是 API 的一部分,并且可能会更改,因此我不建议使用它来执行除调试以外的任何操作。