如何在Xamarin.Forms中创建一个永久运行的后台服务?

8

对于 Android,我可以说永远不能保证后台服务始终运行,因为存在一些限制,例如当设备资源不足时,Google 在较新的 Android 版本中也施加了进一步的限制,甚至某些制造商也会施加限制。Android 的一个可能的选择是使用前台服务。前台服务 - VahidShir
谢谢,这些信息对我很重要。 - naye mtz
2个回答

6
我可以帮您翻译成中文。这段内容涉及编程,需要创建一个依赖服务,但不知道如何操作。首先,在Xamarin.forms项目中创建一个接口(Interface)。
public interface IStartService
{

    void StartForegroundServiceCompat();
}

然后在 xxx.Android 项目中创建一个新文件,我们称之为 itstartServiceAndroid,以实现您想要的服务:

[assembly: Dependency(typeof(startServiceAndroid))]
namespace DependencyServiceDemos.Droid
{
    public class startServiceAndroid : IStartService
    {
        public void StartForegroundServiceCompat()
        {
            var intent = new Intent(MainActivity.Instance, typeof(myLocationService));


            if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.O)
            {
                MainActivity.Instance.StartForegroundService(intent);
            }
            else
            {
                MainActivity.Instance.StartService(intent);
            }

        }
    }

    [Service]
    public class myLocationService : Service
    {
        public override IBinder OnBind(Intent intent)
        {
        }

        public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
        {
            // Code not directly related to publishing the notification has been omitted for clarity.
            // Normally, this method would hold the code to be run when the service is started.

            //Write want you want to do here

        }
    }
}

Xamarin.forms项目中想要调用StartForegroundServiceCompat方法时,您可以使用以下代码:

public MainPage()
{
    InitializeComponent();

    //call method to start service, you can put this line everywhere you want to get start
    DependencyService.Get<IStartService>().StartForegroundServiceCompat();

}

这是关于依赖服务的文档。
对于iOS,如果用户在任务栏中关闭应用程序,则无法再运行任何服务。如果应用程序正在运行,则可以阅读有关iOS后台操作指南/位置操作指南的文档。

2
"MainActivity.Instance"。我没有实例,它是null。我该如何修复?:) - M Yil
1
在你的MainActivity中创建一个静态Instance属性。 - nevermore
你好。我找不到这个“实例”。它是什么? - Daniel Dolz
1
这是 MainActivity 的引用。 - nevermore
你好。你能帮我定义一下IBinder吗? - Pavel Polushin

5

你可能想看看由Allan Ritchie制作的Shiny。虽然它目前仍处于测试版,但我仍建议使用它,因为它可以帮助你节省大量编写代码的麻烦。这里有一个Allan的博客文章,解释了在后台任务方面你可以使用Shiny做些什么。 我认为计划任务是你正在寻找的东西。


2
但那不会起作用,对吗?因为你需要一个前台服务才能频繁获取位置。 - M Yil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接