强制关闭应用程序时,JobScheduler将执行三次

时间:2019-02-17 09:49:24

标签: c# android xamarin android-jobscheduler

我观察到有关定期JobScheduler的一个问题。只要不强制关闭应用程序,它就会按预期工作。在这种情况下,不管方法Schedule()仅被调用一次,都将触发JobScheduler三次。就我而言,JobScheduler在调用OnStop()方法时启动,而在调用OnStart()方法时停止。这意味着只要应用程序在后台运行,JobScheduler都可以工作。

JobScheduler内部的简化代码:

public override bool OnStartJob(JobParameters @params)
{

    CancellationToken token = tokenSource.Token;

    bleTask = Task.Run(async() =>
    {
        await ScanForDevice(@params, token);
    },token);

    return true; 

}

public override bool OnStopJob(JobParameters @params)
{

    if(bleTask != null)
    {

        if (bleTask.Status == TaskStatus.WaitingForActivation)
            tokenSource.Cancel();

    }
    return false;
}

public async Task ScanForDevice(JobParameters jobParams, CancellationToken  token)
{


   for (int i = 0; i < 120; i++)
   {
        if (token.IsCancellationRequested)
        {     
           return;
        }

        await Task.Delay(500);  // piece of code is simulated with some delay
   }
   JobFinished(jobParams, false);

}

我真的不明白为什么在强制关闭应用程序的情况下JobScheduler会被执行三次。如果OnStartJob()返回值为false,则很可能会引起上述问题,这很有趣。

1 个答案:

答案 0 :(得分:0)

如果您的OnStopJob()方法返回true,则对Android意味着:重新安排作业。作为参考,请参见documentation

  

true表示是否要重新安排JobManager的时间   基于作业创建时提供的重试标准的作业;要么   错误以完全结束工作。无论返回的价值如何,   作业必须停止执行。

据我所知,通过返回false已经解决了问题,这是正确的方法。如果应用程序强制终止,则该作业不应运行。