【问题标题】:make GcmNetworkManager periodic task work even after exiting the app?即使在退出应用程序后也让 GcmNetworkManager 定期任务工作?
【发布时间】:2017-02-26 17:28:45
【问题描述】:

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

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

这是 startPeriodicTask 方法

   public void startPeriodicTask() {
        Log.d(TAG, "startPeriodicTask");

        // [START start_periodic_task]
        PeriodicTask task = new PeriodicTask.Builder()
                .setService(MyTaskService.class)
                .setTag(TASK_TAG_PERIODIC)
                .setPeriod(30L)
                .setPersisted(true) // to persist after reboot
                .setRequiredNetwork(Task.NETWORK_STATE_ANY ) 
                .build();

        mGcmNetworkManager.schedule(task);
        // [END start_periodic_task]
    }

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

checkPlayServicesAvailable();
startPeriodicTask();

我已将此添加到清单中,以便重新启动后作业仍然存在

<uses-permission android:name="android.Manifest.permission.RECEIVE_BOOT_COMPLETED" />

【问题讨论】:

  • 你在哪里调用 startPeriodicTask()?是在 Activity、Service、Receiver 中吗?
  • @MichaelVescovo 我在活动中调用 startPeriodicTask(),特别是在 OnCreate 中,正如我在原始帖子中已经写的那样。然后,`PeriodicTask task = new PeriodicTask.Builder() .setService(MyTaskService.class)` 调用具有 onRunTask() 方法的服务 MyTaskService,该方法将在满足条件时执行(有可用网络且周期为向上)。只要活动在前台,它就可以完美地工作,但如果我退出它就不再工作了。
  • 除了最初安装应用程序外,我需要它在后台运行,无需用户干预。除了最初安装应用程序之外,我需要它在后台运行,无需用户干预。

标签: android job-scheduling periodic-task gcm-network-manager gcmtaskservice


【解决方案1】:

在 wifi 恢复后重新开始任务的唯一方法是从 Receiver 调用它。所以你需要创建一个接收器,当网络状态改变时被调用。然后在里面你可以检查它是打开还是关闭。如果它打开,则调用您的方法。

您可以在此文档页面底部的示例中准确了解如何执行此操作:https://developer.android.com/training/basics/network-ops/managing.html

【讨论】:

  • 但不是从 api marshmallow 开始就不再可用了吗?我的意思是声明基于网络更改状态的意图。我认为这不再是从 api23 开始的选项,这就是我尝试使用 jobscheduler 的原因,但它仅限于 api>=21,这让我使用了 gcm,因为它适用于低得多的 api,具有与 jobscheduler 类似的机制。跨度>
  • 不,我不知道你从哪里得到的。据我所知,它适用于所有版本。我自己在 Marshmellow 及更高版本中使用过它,效果很好。我也在 Marshmellow 下使用过它,它也有效。
  • 我的错误。我的意思是牛轧糖不是棉花糖。正如官方文档中所说。 “面向 Android 7.0(API 级别 24)及更高版本的应用如果在其清单中声明广播接收器,则不会接收 CONNECTIVITY_ACTION 广播。如果应用向 Context.registerReceiver() 注册其 BroadcastReceiver 并且该上下文仍然有效,则应用仍将接收 CONNECTIVITY_ACTION 广播。”
  • 这就是我不能使用该解决方案的原因,因为我需要定位 api>=24 以及之前的那些(可能回到 api14),这就是我使用 GcmNetworkManager 的原因因为它适用于 api>=14,唯一的缺点是它需要 google play 服务。
  • GcmNetworkManager 的另一个优点是它在可用时使用作业调度程序,但对于较低的 api,它使用一种 moch 作业调度程序,它可以使相同的代码在更低的 api 上工作,而无需编写不同的代码对于较低的 api
猜你喜欢
  • 2019-03-08
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多