问题标签 [gcm-network-manager]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
83 浏览

android - Android GCMNetworkManager - 每天在特定时间范围内运行作业

我希望能够在每天的某个时间范围内运行定期任务,例如,在上午 8 点到上午 11 点之间。我不确定如何使用 来执行此操作PeriodicTask,因为您无法指定一天中的特定时间。

我偶然发现了这个例子,但它使用了 Evernote 的 Android-Job 库。有没有办法GCMNetworkManager专门实现这一点?

0 投票
1 回答
787 浏览

android - 即使在退出应用程序后也让 GcmNetworkManager 定期任务工作?

我需要一个需要互联网连接并在重新启动后仍然存在的定期任务。我已经取得了很多成就,但问题是我希望应用程序在我退出后也能继续工作。

如,如果我存在应用程序并关闭 wifi 然后再次将其关闭(如果时间已到),则应触发任务并在后台工作。

这是 startPeriodicTask 方法

我只是在检查 playServices 后立即在 OnCreate 中调用此方法

我已将此添加到清单中,以便在重新启动后继续执行该作业

0 投票
1 回答
404 浏览

android - 在 Firebase JobDispatcher 中更改定期任务的周期?

我正在使用 GCM 网络管理器,但后来我听说 Firebase JobDispatcher 包含 GCM 和其他功能,所以我正在尝试使用它。我已经成功地编写了一个周期性任务并且它工作正常,但问题是我需要改变周期而不是从一开始就修复。

原因是,我正在使用活动识别服务,并且我希望下次 JobDispatcher 执行周期性任务时基于检测到的当前活动。例如,如果您正在步行,下一次触发任务是在 30 分钟后,而如果您在汽车中,则时间是 5 分钟(主要是因为如果您在汽车中,则更有可能是您的手机与步行时相比,将在短时间内提供不同的位置值)。

这是我对周期性任务进行编程的方式,如您所见,我正在设置一个固定值,我想知道由该任务触发的服务是否可以提供会改变任务周期的反馈。

0 投票
1 回答
1225 浏览

android - NETWORK_STATE_UNMETERED 是什么?

我需要使用 GcmNetworkManager 来安排 PeriodicTask。我需要告诉系统只有在有WIFI时才传输。但选择是 NETWORK_STATE_CONNECTED、NETWORK_STATE_UNMETERED 和 NETWORK_STATE_ANY。有谁知道NETWORK_STATE_UNMETERED是否只是说WIFI的一种奇特方式?(请提供支持参考。谢谢。)

0 投票
0 回答
207 浏览

java - GcmTaskService:取消和调度当前正在处理的任务的标签

有了GcmNetworkManager,我的理解是两个具有相同标签的任务永远不能同时运行。这是根据文档here

对于每个服务,具有相同标签的两个任务永远不会同时执行。如果在现有任务仍在运行时新计划的任务到达,则新任务将被丢弃。此外,不同的任务可以同时调度,如果它们的调度重叠,每个任务都在单独的线程中调用。在调度多个任务时确保线程安全由您决定。

我的问题是:

如果我们安排一个任务(a OneoffTask):

然后在稍后的某个时候我们取消它,但让我们假设它当前正在运行(它GcmTaskService:onRunTask仍在其线程上运行):

然后在稍后的另一个时间,我们重新安排相同的标签:

GcmTaskService:onRunTask重新安排的任务运行时,是否GcmNetworkManager仍然知道有一个任务正在运行(GcmTaskService::onRunTask()还没有返回?(注意此时它的标签被取消了)

或者它实际上是否因为它的标签被取消而开始一个新的GcmTaskService调用?GcmTakService:onRunTask这意味着实际上可能有两个GcmTaskService:onRunTask相同的标签同时运行。

0 投票
0 回答
175 浏览

android - GcmNetworkManager OneoffTask 经常调用,在 Android N 上检测网络状态变化时出现问题

我需要应用程序在网络状态发生变化时唤醒,即使不在后台运行也是如此。

在 Android N 之前,我在 Manifest 中注册了一个网络状态更改

这在 Android N 上已被弃用。我知道它仍然可以不在 Manifest 中注册它,而是以编程方式注册它,但只要应用程序在后台运行,它就可以工作。-> 但我需要一个在应用程序完全关闭时也能工作的解决方案。

我现在尝试的是有一个服务扩展GcmTaskService它看起来像这样:

基本思想是安排一个在网络变化时触发的任务,如果它确实在未来网络状态再次变化时重新安排该任务。

乍一看,这似乎有效,onRunTask(TaskParams taskParams)每次在我调试时网络发生变化时都会调用它。但是当我把我的安卓手机锁在我的桌子上一小时(并且它连接到无线网络)并且没有移动或任何东西时,该任务在一小时内被调用了大约 40 次!

谁能向我解释为什么这个任务经常被调用?网络状态真的会在一小时内经常发生变化,还是我用OneoffTask错了?

附加问题:我通常希望每次设备从未连接状态切换到已连接状态时执行一项任务,我没有被迫使用 GcmNetworkManager。有没有更好的方法在 android 上实现这一点(不使用推送或任何外部服务)?

0 投票
2 回答
1350 浏览

android - 重启后 GCMNetworkManager 没有运行 PeriodicTask

如果应用程序在前台、后台运行或被终止,应用程序会显示预期的行为。但是,一旦重新启动,就会PeriodicTask停止运行

以下是相关的代码位:

AndroidManifest

定期任务配置:

在 Logcat 中,我得到以下信息:

附加所有相关细节:

AndroidManifest.xml

主要活动

我的任务服务

build.gradle(应用模块)

Edit1:经过几天的分析,我发现了以下几点:

  1. 这是特定于设备的问题。例如,不会在 nexus 设备上发生。
  2. 这是一个更大问题的一部分。显示此行为的设备也无法按预期使用AlarmManager,FirebaseJobSchedulerRECEIVE_BOOT_COMPLETED broadcast receiver
  3. 一种解决方法是此解决方案。然而,这个解决方案至少有两个问题。(1) 当你杀死应用程序时,AccessibilityService权限被重置。这意味着每次您在此之后打开应用程序时,都会手动授予权限。(2)如果应用程序被杀死,之后重新启动不会命中RECEIVE_BOOT_COMPLETED broadcast receiver
  4. 疯狂发现:在一加设备中,如果你的应用test在包结构中有这个词,一切正常!!
  5. 如果您将应用程序列入白名单,进入设置 > 应用程序(其位置和名称在不同设备中可能不同),一切都会按预期工作。
  6. 您必须手动添加应用程序的启动应用程序包含众所周知的应用程序,例如 WhatsApp、Facebook、Instagram 和许多其他应用程序。当您安装这些应用程序时,它们会自动添加到此列表中!我还没有看到这些制造商为此发布了自定义 API。这让我觉得这些应用程序从制造商的角度来说是白名单。
0 投票
1 回答
812 浏览

android - 如何创建具有间隔时间的后台服务

在我的项目中,我需要:

  1. 获取用户位置(经纬度)。
  2. 将其发送到我的 API。
  3. 收到回复。

这一切都在 15 秒之间。我已经知道如何做这些事情,但它必须在后台。我使用JobSchedule的是完美的,它可以处理所有事情,连接、网络状态和时间,但问题是,它与 > 21 的旧版本不兼容!最好的方法是GCMNetworkManager在这些条件下(后台请求和位置)?谢谢!

0 投票
0 回答
128 浏览

android - GCM Networkmanager - 应用程序被杀死时任务未运行

GCMNetworkManager用来加载一些数据或将一些数据设置到数据库中。但是由于某种原因,如果我的应用程序被杀死(在任务管理器中或由于内存原因),任务不会运行。

即使应用程序死了,是否有可能运行任务?

这是我启用任务的代码:

班上BackgroundTasks

服务于AndroidManifest.xml

0 投票
0 回答
209 浏览

android - GcmNetworkManager 不适用于 API 24 及更高版本

当互联网连接可用时,我使用此代码段执行一些服务:

显现 :

它适用于 24 岁以下的 api,但不适用于 24 岁及以上的 api,我怎样才能让它在这个 api 目标中工作?