我已经测试了各种背景选项(xamarin示例,xamarin博客文章,各种来源),但是我想对每个选项的优点/缺点进行澄清,如果其中的一些不赞成/过时。
我的案例是一个应用程序(在客户端上为wifi,位于客户端),应定期轮询服务器以获取新数据,或在服务器建立连接后立即将收集的数据推送到服务器(如果没有连接,则应继续收集数据,但只要连接就推送到服务器)。
我希望此同步在用户的后台运行,与此同时,该用户可以继续工作。我希望每1或2分钟进行一次推送(如果存在数据),因此我可以在无限长的背景作业中创建一个任务,而该任务每1/2分钟检查一次。
我制作了一些基本样本进行测试:
1使用LongRunningTaskService:Service
2)使用Firebase.JobDispatcher
3)使用WorkManager(但计划的作业不能少于15分钟)
4)看着Shiny,但目前无法与Prism集成(但我想我可以使它工作)(但不知道它是否完全包装了?)
您认为哪种解决方案适合我的用例?使用所有4种解决方案时,应在应用程序处于前台或后台时推送数据(对吗?)
如果我仅在应用程序位于前台时才需要推送数据,那么在App类中启动Task是否会出错?
更新
在App.cs的OnInitialized()中进行了尝试:
Task.Factory.StartNew(async () =>
{
while (true)
{
await BackgroundTasks.TestPushDataRepeat();
await Task.Delay(60000);
}
}
, TaskCreationOptions.LongRunning);
当应用程序处于前台状态时(它不会阻塞UI),它每分钟都起作用,但是当应用程序处于后台时,它也出乎意料地起作用(就我而言,这不是必需的)。不是服务,我以为应该冻结了,为什么呢?
我试图更好地理解/分离TPL如何与Android上的Xamarin一起使用,以及Android背景(服务/工作人员等)如何工作,以查看此解决方案是否有缺点。
在Android上,您不能每30秒运行一次后台任务/作业/工作者。这种行为可能会对电池造成负面影响,并且只能通过需要用户可见通知的“前台服务”来实现。
您为WorkManager看到的大约15分钟最小间隔的限制是操作系统约束,而不是库约束。如果使用JobScheduler,则有相同的限制。另外,工作程序(如果使用JobScheduler,则为Job)只能运行10分钟。
因此,您需要一个前台服务。在这种情况下,您仍然可以使用WorkManager及其高级功能,但是您需要使用WorkManager 2.3+并将您的工作人员“提升”到Foreground Service。 WorkManager's documentation covers this use case。
此为本机Android(Java / Kotlin)。我不知道最新的Xamarin绑定如何涵盖此用例。