在Android中强制执行GCMNetworkManager OneoffTask

时间:2015-07-06 05:24:51

标签: android google-cloud-messaging

我正在使用GcmNetworkManager来安排OneoffTask,其执行窗口从0开始。在documentations中提及

  

请注意,您可以请求在将来的任何时间执行一次性任务,但为了防止滥用,调度程序将来只会在至少30秒内设置警报。如果发生某些网络事件以唤醒调度程序,您的任务仍可以比此更早运行。

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

2 个答案:

答案 0 :(得分:0)

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

目前,您无法触发先前计划的任务。但是,您可以运行adb shell命令来触发具有特定标记的特殊oneoff调试任务。 documentation on GcmNetworkManager具有细节。

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

不幸的是,如果没有一个事件而不是警报来唤醒网络管理员,这是不可能的。 GNM目前的工作方式是客户端调用计划(任务)被视为唤醒(或任何其他API调用)。

如果你安排了你的任务,然后在第二个"计划"之后不久安排了另一个任务。调用可能会使GNM运行第一个。这是未记录的,不是API的一部分,可能会发生变化,因此我不建议使用它来执行除调试之外的任何操作。

答案 1 :(得分:0)

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

虽然下面的方法乍一看似乎是错误的代码,但是在使用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);
    }
}