在 Android 中强制执行 GCMNetworkManager OneoffTask

Force execution of GCMNetworkManager OneoffTask in Android

我正在使用 GcmNetworkManager 安排一个 OneoffTask 并从 0 开始执行 windows。在 documentations 中提到

Note that you can request a one-off task to be executed at any point in the future, but to prevent abuse the scheduler will only set an alarm at a minimum of 30 seconds in the future. Your task can still be run earlier than this if some network event occurs to wake up the scheduler.

这对我来说是个问题,因为我必须等待 30 秒才能执行任务,而我希望尽可能立即执行它。有什么办法可以实现吗?

您的意思是您希望能够强制执行以调试您的 OneoffTask?

目前您无法触发之前计划的任务。但是,有一个 adb shell 命令,您可以 运行 触发带有特定标记的特殊一次性调试任务。 documentation on GcmNetworkManager 有细节。

或者您的意思是希望您的 OneoffTask 能够立即运行?

不幸的是,如果没有某些事件除了警报 发生以唤醒网络管理器,这是不可能的。 GNM 当前的工作方式是客户端调用 schedule(Task) 被视为唤醒(或任何其他 API 调用)。

如果您安排了您的任务,然后在第二次 "schedule" 调用后不久又安排了另一个任务,那么 GNM 可能会撞到 运行 第一次调用。这是未记录的,不是 API 的一部分,并且可能会更改,因此我不建议使用它来做调试以外的任何事情。

有一种方法可以实现强制立即执行任何任务。

虽然下面的方法乍一看似乎是糟糕的代码,但在使用 GcmNetworkManager 编写后台数据同步代码后,大多数开发人员都希望在应用程序处于前台时重用相同的代码段。为什么任何应用程序都应该有一个 GcmTskService 和一个 AsyncTask/IntentService,两者都调用相同的数据同步 API 端点?

我遇到了同样的问题,使用下面的代码片段实现了一次性任务的立即执行-

@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);
    }
}