如何在Xamarin.Forms中创建一个永无止境的后台服务?

时间:2019-09-25 22:53:11

标签: xamarin xamarin.forms background-service foreground-service

我每15分钟监视一次用户的位置,我只是希望应用程序继续发送该位置,即使用户在任务栏中关闭了该应用程序也是如此。

我尝试了这个示例,但是它在Xamarin.Android https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/services/foreground-services中,我必须创建一个dependencyservice,但是我不知道如何。

2 个答案:

答案 0 :(得分:3)

您可能想看看Allan Ritchie的Shiny。它目前处于测试阶段,但我仍然建议您使用它,因为它可以避免您自己编写此代码的许多麻烦。这是blog post by Allan,从后台任务的角度解释了Shiny的功能-我认为计划的工作是您所需要的。

答案 1 :(得分:0)

  

我必须创建一个dependencyservice,但是我不知道如何。

首先,在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

        }
    }
}

一旦您想在StartForegroundServiceCompat项目中调用Xamarin.forms方法,就可以使用:

public MainPage()
{
    InitializeComponent();

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

}

这是关于dependency-service

的文档

对于iOS,如果用户在任务栏中关闭应用程序,则您将不再能够运行任何服务。如果应用程序正在运行,则可以阅读有关ios-backgrounding-walkthroughs/location-walkthrough

的文档