我正在尝试使用GCM Network Manager将日志发送到我们的后端服务。我们每个小时运行一个闹钟,创建一个OneoffTask,在执行时将调用后端服务并发送日志消息。
这个方法确实可以执行,但是非常大量的任务都会丢失(远超过一半)。一开始,我认为这可能与我们的后端或网络有关,但是在添加了大量文件记录之后,发现这些任务的onRunTask从未被触发(但它们肯定已被计划)。为什么会出现这种情况?我是否误解了API,或者OneoffTasks不可靠?
以下是如何调度OneoffTask的方式:
这个方法确实可以执行,但是非常大量的任务都会丢失(远超过一半)。一开始,我认为这可能与我们的后端或网络有关,但是在添加了大量文件记录之后,发现这些任务的onRunTask从未被触发(但它们肯定已被计划)。为什么会出现这种情况?我是否误解了API,或者OneoffTasks不可靠?
以下是如何调度OneoffTask的方式:
GcmNetworkManager.getInstance(context).schedule(new OneoffTask.Builder()
.setService(AvroLogService.class)
.setExtras(bundle)
// A mandatory tag which identifies the task
// We add a unique hash to the tag to make sure that
// tasks are logged and not thrown away as dupes.
// See: https://dev59.com/8JLea4cB1Zd3GeqP3Yjy
.setTag(java.util.UUID.randomUUID().toString())
// Persist to disk, even across boots:
.setPersisted(true)
// Sets a time frame for the execution of this task in seconds.
// This specifically means that the task can either be
// executed right now, or at latest at a certain point:
.setExecutionWindow(0, TWO_WEEKS_IN_SECONDS)
.build());
再次强调,这只适用于部分消息,对于后续丢失的消息,上述代码绝对被执行(我已添加文件日志以进行验证),但是没有相应的onRunTask触发器来处理丢失的消息。
我已经验证:
- 根据网络管理器实现指南更新了清单(https://developers.google.com/cloud-messaging/network-manager)
- AvroLogService(我的服务)扩展了GcmTaskService
- 它重写了onRunTask
- 应用程序具有RECEIVE_BOOT_COMPLETED权限。
- AvroLogService未覆盖onStartCommand。
我迷失了方向。有人能分享一下这方面的见解吗?
GcmNetworkManager
的更多见解和示例。如果您还没有这样做,该帖子中提到了需要在onRunTask()
内提供任务执行逻辑,并且您必须跟踪您需要的特定任务状态,以便实现您想要的功能。 - Teyamadb shell dumpsys activity service GcmService
。当其他应用程序也使用GCM网络管理器时,它们可能会阻止您的请求。 - Mysterious_android