强制 GcmTaskService 立即运行

Posted

技术标签:

【中文标题】强制 GcmTaskService 立即运行【英文标题】:Force GcmTaskService to run immediately 【发布时间】:2015-09-17 10:05:09 【问题描述】:

我正在尝试在没有waiting the 30 seconds 的情况下启动GcmTaskService。如果任务不成功,那么它应该遵循通常的GcmTasks'规则。

但为了防止滥用,调度程序只会设置一个最低限度的警报 未来 30 秒。您的任务仍然可以早于 如果发生某些网络事件以唤醒调度程序,则会出现此情况。

这不起作用:

public static void start(Context context) 
    context.startService(new Intent(context, FileDownloadService.class).setAction(
            SERVICE_ACTION_EXECUTE_TASK));

我宁愿没有两个服务做同样的事情。

【问题讨论】:

【参考方案1】:

您无法在 GcmTaskService b/c 上启动服务,这是 Google Play 服务启动您的任务的方式。 如果您绝对需要,您可以覆盖 onStartCommand() (确保在检查完意图是否符合您的预期后调用 super.onStartCommand)。如果你这样做,它看起来像

public int onStartCommand(...) 
    if ("my.app.TRIGGER_TASK".equals(intent.getAction())) 
        // run your task logic.
    
    return super.onStartCommand(...);

也就是说,如果您在 onStartCommand 中运行您的任务,它将在您应用的主线程上运行您的任务,因此您无法执行任何阻塞 i/o。

此外,您可能会遇到 GcmTaskService 在检测到先前执行的任务已完成时自行调用 stopService() 的问题。

或者(更安全)您可以绑定到您的 GcmTaskService 足够长的时间来启动您的任务。您可以安全地在活页夹线程上执行 onRunTask() 逻辑。您必须自己处理同步。

【讨论】:

以上是关于强制 GcmTaskService 立即运行的主要内容,如果未能解决你的问题,请参考以下文章

VS2010编写的WinForm程序,在调试运行了几个小时候后弹出: 正在停止调试,但尚未完成你可以强制立即停止

如何强制wireguard立即握手?

如何强制 GetQueuedCompletionStatus() 立即返回?

RabbitMQ 使用立即位和强制位

如何强制网格在更改时立即将值传播到数据源?

如何使用 UIKit 在 Swift 5 中立即强制更新我的 UI?