【问题标题】:JobScheduler is executed three times when the application is force closedJobScheduler 在应用程序被强制关闭时执行 3 次
【发布时间】:2019-02-17 09:49:24
【问题描述】:

我观察到一个关于周期性 JobScheduler 的问题。只要应用程序未强制关闭,它就会按预期工作。在这种情况下,JobScheduler 会被触发 3 次,而不管 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() 返回值为 false,那么上述问题将无法重现。

【问题讨论】:

标签: c# android xamarin android-jobscheduler


【解决方案1】:

如果您的OnStopJob() 方法返回true,这对Android 意味着:重新安排工作。如需参考,请参阅documentation

true 向 JobManager 表明您是否要重新安排 该作业基于创建作业时提供的重试标准;或者 false 完全结束工作。无论返回的值是多少,您的 作业必须停止执行。

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

【讨论】:

  • 感谢您的回复。我同意如果 OnStartJob() 的返回值为 false,则取消作业。但问题是我们不知道在代码的哪一部分取消了方法ScanForDevice()。这对我来说很重要,因为我的实际应用程序中的方法启动和停止蓝牙扫描,我需要知道蓝牙处于什么状态(扫描或不扫描)。有没有可能解决这个问题?
  • 我不明白您为什么需要知道 ScanForDevice() 是否正在扫描。如果您的应用程序被强制终止,如果它已经在运行,Android 将自动停止您的扫描。如果您只需要记录下来以备将来参考,那么我想您可以在每次开始或停止扫描时写入持久存储。这样,当您的应用最终重新启动时,您可以看到应用上次运行时的扫描状态。
  • 感谢您的回复。老实说,我不知道当应用程序被强制终止时,Android 会自动停止扫描。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多