JobScheduler 在应用被强行关闭时执行了 3 次

JobScheduler is executed three times when the application is force closed

我观察到一个关于周期性 JobScheduler 的问题。只要应用程序没有被强制关闭,它就会按预期工作。在这种情况下,JobScheduler 被触发了三次,而不管 Schedule() 方法只被调用了一次这一事实。在我的例子中,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执行了3次。非常有趣的是,如果 OnStartJob() return 值为 false,则上述问题无法重现。

如果您的 OnStopJob() 方法 returns true 意味着 Android:重新安排作业。有关参考,请参阅 documentation.

true to indicate to the JobManager whether you'd like to reschedule this job based on the retry criteria provided at job creation-time; or false to end the job entirely. Regardless of the value returned, your job must stop executing.

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