添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本指南讨论如何使用 Google 中的 Firebase 作业调度程序库计划后台工作。

使 Android 应用程序对用户进行响应的最佳方式之一是确保在后台执行复杂的或长时间运行的工作。 但重要的是,后台工作不会对用户对设备的体验产生负面影响。

例如,后台作业可能每三或四分钟轮询一次网站,以查询特定数据集的更改。 这似乎是良性的,但会对电池寿命产生灾难性影响。 应用程序将重复唤醒设备,将 CPU 提升到较高的电源状态,启动无线电收发器,使网络请求,然后处理结果。 这种情况更糟,因为设备不会立即断电并返回到低功耗空闲状态。 计划不良的后台工作可能会意外地使设备处于一种不必要和过多电源要求的状态。 此看似合法的活动 (轮询网站) 会使设备在相对较短的时间内不可用。

Android 提供以下 Api,可帮助在后台执行工作,但其本身并不是用于智能作业计划的。

  • 意向服务 –意向服务非常适合用于执行工作,但他们不提供计划工作的方式。
  • AlarmManager –这些 api 只允许计划工作,但不能实际执行工作。 此外,AlarmManager 只允许基于时间的约束,这意味着在特定时间或经过一段时间后发出警报。
  • JobScheduler – JobSchedule 是一种很好的 API,适用于操作系统来计划作业。 不过,它仅适用于面向 API 级别21或更高版本的 Android 应用程序。
  • 广播接收 方– Android 应用可设置广播接收器来执行工作,以响应系统范围内的事件或意向。 但是,广播接收器不提供对作业运行时间的任何控制。 同时,Android 操作系统中的更改将限制广播接收方的工作时间或它们可以响应的工作类型。
  • 可以通过两个主要功能有效地执行后台工作 (有时称为 后台作业 作业 ) :

  • 智能地计划工作 –当应用程序在后台执行工作时,这一点非常重要。 理想情况下,应用程序不应要求运行作业。 相反,应用程序应指定在作业可以运行时必须满足的条件,然后计划在满足条件时运行的工作。 这允许 Android 智能地执行工作。 例如,可能会批处理网络请求同时运行全部,以充分利用网络所涉及的开销。
  • 封装工作 -用于执行后台工作的代码应封装在独立于用户界面的离散组件中,如果由于某种原因无法完成工作,则可以相对容易地重新计划。
  • Firebase 作业调度程序是 Google 中的一个库,提供 Fluent API 来简化计划后台工作。 它旨在取代 Google Cloud Manager。 Firebase 作业调度程序包含以下 Api:

  • Firebase.JobDispatcher.JobService 是一个抽象类,必须使用要在后台作业中运行的逻辑进行扩展。
  • Firebase.JobDispatcher.JobTrigger 在应启动作业时声明。 这通常以时间窗口的形式表示,例如,在启动作业之前等待至少30秒,但在5分钟内运行作业。
  • 包含有关作业未能正常执行时应执行的操作的 Firebase.JobDispatcher.RetryStrategy 信息。 重试策略指定尝试再次运行作业之前等待多长时间。
  • Firebase.JobDispatcher.Constraint 是一个可选值,用于描述在作业可以运行之前必须满足的条件,如设备在未计费的网络上或正在充电。
  • Firebase.JobDispatcher.Job 是一个 API,它将上一个 api 统一到可由 JobDispatcher 计划的工作单元。 Job.Builder 类用于实例化 Job
  • Firebase.JobDispatcher.JobDispatcher 使用前面的三个 api 来计划操作系统的工作,并在必要时提供取消作业的方法。
  • 若要计划使用 Firebase 作业调度程序,Xamarin Android 应用程序必须将代码封装在扩展 JobService 类的类型中。 JobService 有三种可以在作业的生存期内调用的生命周期方法:

  • bool OnStartJob(IJobParameters parameters) –此方法用于执行工作,并且应始终实现此方法。 它在主线程上运行。 如果剩余工作或 false 完成工作,则此方法将返回 true
  • bool OnStopJob(IJobParameters parameters) –当出于某种原因停止作业时,将调用此。 如果应稍后重新计划作业,则它应返回 true
  • JobFinished(IJobParameters parameters, bool needsReschedule) –当完成任何异步工作时 JobService ,将调用此方法。
  • 若要计划作业,应用程序将实例化 JobDispatcher 对象。 然后, Job.Builder 使用来创建一个 Job 对象, JobDispatcher 该对象将用于尝试和计划作业运行的。

    本指南将讨论如何向 Xamarin Android 应用程序添加 Firebase 作业调度程序,并使用它来计划后台工作。

    Firebase 作业调度程序需要 Android API 级别9或更高版本。 Firebase 作业调度程序库依赖于 Google Play Services 提供的某些组件;设备必须安装 Google Play Services。

    在 Xamarin 中使用 Firebase 作业调度程序库

    若要开始 Firebase 作业调度程序,请首先将 Firebase. JobDispatcher NuGet 包 添加到 Xamarin 项目。 在 NuGet 程序包管理器中搜索仍处于预发布) (包。

    添加 Firebase 作业调度程序库后,创建一个 JobService 类,然后将其计划为使用的 FirebaseJobDispatcher 实例运行。

    创建 JobService

    Firebase 作业调度程序库执行的所有工作都必须在一个扩展 Firebase.JobDispatcher.JobService 抽象类的类型中完成。 JobService 创建非常类似于使用 Android framework 创建 Service

  • JobService 扩展类
  • ServiceAttribute 修饰子类。 尽管不是严格需要的,但建议显式设置 Name 参数以帮助调试 JobService
  • IntentFilter 添加以在 IntentFilter 中声明 JobService 。 这也有助于 Firebase 作业调度程序库定位并调用 JobService
  • 下面的代码是应用程序的最简单 JobService 示例,使用 TPL 异步执行一些工作:

    [Service(Name = "com.xamarin.fjdtestapp.DemoJob")]
    [IntentFilter(new[] {FirebaseJobServiceIntent.Action})]
    public class DemoJob : JobService
        static readonly string TAG = "X:DemoService";
        public override bool OnStartJob(IJobParameters jobParameters)
            Task.Run(() =>
                // Work is happening asynchronously (code omitted)
            // Return true because of the asynchronous work
            return true;  
        public override bool OnStopJob(IJobParameters jobParameters)
            Log.Debug(TAG, "DemoJob::OnStartJob");
            // nothing to do.
            return false;
    

    创建 FirebaseJobDispatcher

    在计划任何工作之前,需要创建一个 Firebase.JobDispatcher.FirebaseJobDispatcher 对象。 FirebaseJobDispatcher负责计划 JobService 。 以下代码片段是创建实例 FirebaseJobDispatcher 的一种方法:

    // This is the "Java" way to create a FirebaseJobDispatcher object
    IDriver driver = new GooglePlayDriver(context);
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(driver);
    

    在前面的代码片段中, GooglePlayDriver 是一种有助于 FirebaseJobDispatcher 与设备上 Google Play Services 中的某些计划 api 进行交互的类。 参数 context 是任何 Android Context ,如活动。 GooglePlayDriver目前,是 Firebase 作业调度程序库中的唯一 IDriver 实现。

    Firebase 作业调度程序的 Xamarin 绑定提供了一个用于从中 Context 创建的 FirebaseJobDispatcher 扩展方法:

    FirebaseJobDispatcher dispatcher = context.CreateJobDispatcher();
    

    FirebaseJobDispatcher实例化后,可以创建 Job 并运行类中 JobService 的代码。 JobJob.Builder 对象创建,将在下一节中讨论。

    使用作业创建 Firebase. JobDispatcher

    Firebase.JobDispatcher.Job类负责封装运行 JobService 所需的元数据。 Job包含一些信息,如在作业可以运行之前必须满足的任何约束(如果是重复的 Job )或将导致作业运行的任何触发器。 至少 Job 必须有一个 Job (唯一字符串,该字符串用于标识) 的作业 FirebaseJobDispatcher 和应运行的的 JobService 类型。 在运行作业时,Firebase 作业调度程序将实例化 JobServiceJob使用类的实例 Firebase.JobDispatcher.Job.JobBuilder 创建。

    下面的代码片段是如何使用 Xamarin for Android 绑定创建的 Job 最简单示例:

    Job myJob = dispatcher.NewJobBuilder()
                          .SetService<DemoJob>("demo-job-tag")
                          .Build();
    

    Job.Builder将对作业的输入值执行一些基本验证检查。 如果无法 Job.Builder 创建 Job ,则会引发异常。 Job.Builder将创建具有以下默认值的 Job

  • JobJob (计划运行多长时间) 仅在设备重新启动之后才会丢失。设备重新启动 Job 后,将丢失。
  • Job不会定期执行–它将只运行一次。
  • Job将计划尽快运行。
  • Job 默认重试策略是使用 Job (在 设置 RetryStrategy) 部分中更详细地讨论。
  • 创建 Job 后,需要在运行之前通过 FirebaseJobDispatcher 计划。 计划 Job 有两种方法:

    // This will throw an exception if there was a problem scheduling the job
    dispatcher.MustSchedule(myJob);
    // This method will not throw an exception; an integer result value is returned
    int scheduleResult = dispatcher.Schedule(myJob);
    

    返回 FirebaseJobDispatcher.Schedule 的值将为以下整数值之一:

  • FirebaseJobDispatcher.ScheduleResultSuccessJob–已成功计划。
  • FirebaseJobDispatcher.ScheduleResultUnknownError –发生了阻止计划的 Job 某些未知问题。
  • FirebaseJobDispatcher.ScheduleResultNoDriverAvailable –使用了无效 IDriver 的,或 IDriver 因某种原因而不可用。
  • FirebaseJobDispatcher.ScheduleResultUnsupportedTriggerTrigger-不支持。
  • FirebaseJobDispatcher.ScheduleResultBadService –服务配置不正确或不可用。
  • 可以自定义作业。 如何自定义作业的示例包括:

  • 参数传递到作业–可能需要额外的值来执行其工作,例如,下载文件。
  • 设置约束 –在满足某些条件时,可能只需要运行作业。 例如,仅在设备充电时运行 Job
  • 指定何时 运行 – Firebase 作业调度程序允许应用程序指定作业应运行的时间。
  • 声明失败的作业的重试策略重试策略向提供有关无法完成的操作 的指导
  • 以下各节将详细讨论其中的每个主题。

    将参数传递到作业

    通过创建 BundleJob.Builder.SetExtras 方法一起传递的来将参数传递给作业:

    Bundle jobParameters = new Bundle();
    jobParameters.PutInt(FibonacciCalculatorJob.FibonacciPositionKey, 25);
    Job myJob = dispatcher.NewJobBuilder()
                          .SetService<DemoJob>("demo-job-tag")
                          .SetExtras(jobParameters)
                          .Build();
    

    Bundle可从 IJobParameters.Extras 方法的属性 OnStartJob 访问:

    public override bool OnStartJob(IJobParameters jobParameters)
        int position = jobParameters.Extras.GetInt(FibonacciPositionKey, DEFAULT_VALUE);
        // rest of code omitted
    

    约束有助于降低设备的成本或电池消耗。 类将 Firebase.JobDispatcher.Constraint 这些约束定义为整数值:

  • Constraint.OnUnmeteredNetwork –仅当设备连接到无法进行的网络时运行作业。 这有助于防止用户产生数据收费。
  • Constraint.OnAnyNetwork –在设备连接到的任何网络上运行作业。 如果与 Constraint.OnUnmeteredNetwork 一起指定,则此值优先。
  • Constraint.DeviceCharging –仅在设备充电时运行作业。
  • 约束是通过 Job.Builder.SetConstraint 方法设置的:

    Job myJob = dispatcher.NewJobBuilder()
                          .SetService<DemoJob>("demo-job-tag")
                          .SetConstraint(Constraint.DeviceCharging)
                          .Build();
    

    JobTrigger为操作系统提供有关何时应启动作业的指导。 JobTrigger具有一个JobTrigger,该窗口定义了应在何时运行的 Job 计划时间。 执行窗口有一个 开始窗口 值和一个 结束窗口 值。 "开始" 窗口是设备在运行作业之前应等待的秒数,而 "结束时间" 值是运行 Job 前等待的最大秒数。

    JobTrigger可以使用 Firebase.Jobdispatcher.Trigger.ExecutionWindow 方法创建。 例如 Trigger.ExecutionWindow(15,60) ,该作业的运行时间应介于15到60秒之间。 Job.Builder.SetTrigger方法用于

    JobTrigger myTrigger = Trigger.ExecutionWindow(15,60);
    Job myJob = dispatcher.NewJobBuilder()
                          .SetService<DemoJob>("demo-job-tag")
                          .SetTrigger(myTrigger)
                          .Build();
    

    作业的默认 JobTrigger 值由值表示,此值 Trigger.Now 指定在计划后尽快运行作业。

    设置 RetryStrategy

    Firebase.JobDispatcher.RetryStrategy用于指定在尝试重新运行失败的作业之前设备应使用的延迟量。 RetryStrategy有一个策略,该RetryStrategy定义将使用哪种时间基准算法来重新计划失败的作业,并指定一个执行窗口,该窗口指定应在其中安排作业的窗口。 此重新 计划窗口 由两个值定义。 第一个值是在重新安排作业之前等待的秒数, () 的 初始回退 值,第二个数字是在) 最大回退 值 (运行作业之前必须等待的最大秒数。

    这两种类型的重试策略由以下 int 值标识:

  • RetryStrategy.RetryPolicyExponentialRetryStrategy.RetryPolicyExponential 策略会在每次发生故障后以指数方式增加初始回退值。 第一次作业失败时,库将 _initial 等待指定的时间间隔,然后再重新计划作业–示例30秒。 第二次作业失败时,库将等待至少60秒,然后再尝试运行作业。 第三次尝试失败后,库将等待120秒,依此类推。 Firebase 作业调度程序库的默认值 RetryStrategy 由对象表示 RetryStrategy.DefaultExponential 。 它的初始回退为30秒,最大回退为3600秒。
  • RetryStrategy.RetryPolicyLinear –此策略是一种 RetryStrategy.RetryPolicyLinear ,应将作业重新安排为按设置的时间间隔运行 (直到成功) 。 线性回退最适用于必须尽快完成的工作,或者用于快速解决自身问题的问题。 Firebase 作业调度程序库定义了一个 RetryStrategy.DefaultLinear 至少为30秒且最长为3600秒的重新计划窗口。
  • 可以使用 FirebaseJobDispatcher.NewRetryStrategy 方法定义自定义 RetryStrategy 。 它采用三个参数:

  • int policy –该 int policy 为先前 RetryStrategy 的值 RetryStrategy.RetryPolicyLinear 之一:、或 RetryStrategy.RetryPolicyExponential
  • int initialBackoffSecondsint initialBackoffSeconds 是指再次尝试运行作业之前需要延迟的时间(以秒为单位)。 此值的默认值为30秒。
  • int maximumBackoffSecondsint maximumBackoffSeconds 值声明尝试再次运行作业之前延迟的最大秒数。 默认值为3600秒。
  • RetryStrategy retry = dispatcher.NewRetryStrategy(RetryStrategy.RetryPolicyLinear, initialBackoffSeconds, maximumBackoffSet);
    // Create a Job and set the RetryStrategy via the Job.Builder
    Job myJob = dispatcher.NewJobBuilder()
                          .SetService<DemoJob>("demo-job-tag")
                          .SetRetryStrategy(retry)
                          .Build();
    

    可以取消已计划的所有作业,或者只是使用 FirebaseJobDispatcher.CancelAll() 方法或 FirebaseJobDispatcher.Cancel(string) 方法的单个作业:

    int cancelResult = dispatcher.CancelAll(); 
    // to cancel a single job:
    int cancelResult = dispatcher.Cancel("unique-tag-for-job");
    

    任一方法都将返回一个整数值:

  • FirebaseJobDispatcher.CancelResultSuccess -作业已成功取消。
  • FirebaseJobDispatcher.CancelResultUnknownError –错误阻止作业被取消。
  • FirebaseJobDispatcher.CancelResult.NoDriverAvailableFirebaseJobDispatcher–无法取消作业,因为没有可用的有效 IDriver
  • 本指南讨论了如何使用 Firebase 作业调度程序在后台智能地执行工作。 本文介绍了如何封装要作为 JobService 执行的工作,以及如何使用 FirebaseJobDispatcher 来计划该工作、使用指定条件 JobTrigger 以及如何使用 RetryStrategy 来处理失败。

  • NuGet 上的 JobDispatcher
  • firebase GitHub 上的调度程序
  • Firebase. JobDispatcher 绑定
  • 智能作业-计划
  • Android 电池和内存优化-Google i/o 2016 (视频)
  •