android - 从GCM迁移到FCM后的PeriodicTask和OneoffTask

标签 android firebase google-cloud-messaging firebase-cloud-messaging

问题

从 GCM 迁移到 FCM 时,我应该使用什么来代替 periodictask 和 oneofftask? FCM 包中有等效的吗?

背景

最近 Google 已弃用 GCM,他们提供了 migration guide ,但我在那里找不到任何有关迁移PeriodicTasks 和OneOffTasks 的信息。

教程说replace play-services-gcmfirebase-messaging 但我找不到任何与此 package 中的任务类似的内容,所以我想知道他们是否完全放弃了它们,或者我们实际上是否可以继续使用PeriodicTask/OneOffTasks?

最佳答案

PeriodicTask 和 OneoffTask 类(GcmNetworkManager 组件的一部分)可以替换为 Firebase Job Dispatcher ,这是一个开源库,用于安排将在应用程序进程中执行的工作单元。它公开的服务端 API 镜像了框架的 JobScheduler API,与 GcmNetworkManager 略有不同。升级应该是一个相当简单的机械变化。

升级步骤

将以下内容添加到 build.gradle 的依赖项部分:

implementation 'com.firebase:firebase-jobdispatcher:0.8.5'

让您的 GcmTaskService 实现扩展 JobService。从此:

public class MyTaskService extends GcmTaskService {
  @Override
  public int onRunTask(TaskParams params) {
    // Runs in its own thread
    // ...
    return RESULT_SUCCESS;
  }
}

对此:

public class MyJobService extends JobService {
  @Override
  public boolean onStartJob(JobParameters job) {
    // Runs on the main thread!
    // ...
    return false; // "Did we start any background work?"
  }

  @Override
  public boolean onStopJob(JobParameters job) {
    // Runs on the main thread!
    // ...
    return false; // "Should this job be retried?"
  }
}

如果您不想管理自己的线程,可以利用库附带的 SimpleJobService:

public class MyJobService extends SimpleJobService {
  @Override
  public int onRunJob(JobParameters job) {
    // Runs on its own thread!
    // ...
    return JobService.RESULT_SUCCESS;
  }
}

确保调整您的 list 。将之前的 GcmTaskService 条目替换为如下内容:

<service
    android:exported="false"
    android:name=".MyJobService">
    <intent-filter>
        <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
    </intent-filter>
</service>

日程安排很简单:

// Create a new dispatcher using the Google Play driver.
FirebaseJobDispatcher dispatcher =
  new FirebaseJobDispatcher(new GooglePlayDriver(context));

Job myJob = dispatcher.newJobBuilder()
    // the JobService that will be called
    .setService(MyJobService.class)
    // uniquely identifies the job
    .setTag("my-unique-tag")
    // one-off job (only runs once unless a retry is requested)
    .setRecurring(false)
    // don't persist past a device reboot (requires RECEIVE_BOOT_COMPLETE)
    .setLifetime(Lifetime.UNTIL_NEXT_BOOT)
    // start between 0 and 60 seconds from now
    .setTrigger(Trigger.executionWindow(0, 60))
    // don't overwrite an existing job with the same tag
    .setReplaceCurrent(false)
    // retry with exponential backoff
    .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
    // constraints that need to be satisfied for the job to run
    .setConstraints(
        // only run on an unmetered network
        Constraint.ON_UNMETERED_NETWORK,
        // only run when the device is charging
        Constraint.DEVICE_CHARGING
    )
    .setExtras(myExtrasBundle)
    .build();

dispatcher.mustSchedule(myJob);

检查repo了解更多信息。

关于android - 从GCM迁移到FCM后的PeriodicTask和OneoffTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49797085/

相关文章:

PHP 代码在单次提交时运行多次

android - 任何人都可以将录音机的代码作为Android手机上的应用程序提供吗?

swift - Firebase 快照未正确解析数据

android - 如果我启动 Firebase 跟踪并且永远不会停止它?它会在 Android 上引起问题吗?

android - SHA1 证书指纹

android - 当应用程序处于前台时,GCM 3.0 通知有效负载不显示 android 通知

android - 从 JSON 中获取数据到 ListView

Android IMAGE_CAPTURE Intent 在 onActivityResult 之后保存照片

java - Android alarmManager.setAlarmClock 崩溃 Android 7

javascript - React Native 和 Firebase promise - 对渲染产生奇怪的副作用