使用Xamarin.Forms Android的所有背景选项(以及它们的时间演变)之间的混淆

问题描述 投票:0回答:1

我已经测试了各种背景选项(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背景(服务/工作人员等)如何工作,以查看此解决方案是否有缺点。

xamarin xamarin.forms xamarin.android android-workmanager firebase-job-dispatcher
1个回答
1
投票

在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绑定如何涵盖此用例。

© www.soinside.com 2019 - 2024. All rights reserved.