如何在Xamarin.Forms中创建在期间工作的服务?

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

我正在构建应用程序,当应用程序第一次运行时,大约1小时或更长时间后,它会自动连接到服务器获取数据,以便在用户关闭应用程序时进行预付费显示

xamarin.forms xamarin.android
1个回答
0
投票

首先,当用户关闭应用程序时,后台服务器无法像打开应用程序一样运行,它将被Android系统关闭。

如果app在后端运行,Android应用程序将无法再在Android 8.0(API级别26)或更高级别的后台运行。当应用程序进入后台时,Android将为应用程序授予一定的时间来启动和使用服务。一旦该时间过去,应用程序将无法再启动任何服务,并且将终止所有已启动的服务。此时,应用程序无法执行任何工作。

因此,根据您的需求,在前台启动服务是一个不错的选择(但用户无法关闭此应用程序) - 前台服务对于应用程序必须在后台执行某些任务并且用户可能需要定期交互时非常有用有了这个任务。前台服务将显示持久通知,以便用户知道应用程序正在运行后台任务,并且还提供监视任务或与任务交互的方法。

有我的代码。

MainPage.cs

public partial class MainPage : ContentPage
{
   static bool isRunning = true;
    public MainPage()
    {
        InitializeComponent();
        // BindingContext = new CollectionViewModel();


        if(isRunning){
            //setting one hours to open the service.
            Device.StartTimer(TimeSpan.FromHours(1), () =>
            {
                // Do something
                DependencyService.Get<IService>().Start();
                return false; // True = Repeat again, False = Stop the timer
            });
            isRunning = false;
        }

        bt1.Clicked += (o, e) =>
        {

             Navigation.PushAsync(new Page1());
        };
    }

我使用dependencyservice来实现forground service

IService.cs为android创建一个启动服务的接口。

public interface IService
{
    void Start();
}

然后实现DependentService开始前台服务。

DependentService.cs

[assembly: Xamarin.Forms.Dependency(typeof(DependentService))]
namespace TabGuesture.Droid
{
[Service]
public class DependentService : Service, IService
{
    public void Start()
    {
        var intent = new Intent(Android.App.Application.Context, 
 typeof(DependentService));


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

    public override IBinder OnBind(Intent intent)
    {
        return null;
    }
    public const int SERVICE_RUNNING_NOTIFICATION_ID = 10000;
    public override StartCommandResult OnStartCommand(Intent intent, 
    StartCommandFlags flags, int startId)
    {
        // From shared code or in your PCL

        CreateNotificationChannel();
        string messageBody = "service starting";

        var notification = new Notification.Builder(this, "10111")
        .SetContentTitle(Resources.GetString(Resource.String.app_name))
        .SetContentText(messageBody)
        .SetSmallIcon(Resource.Drawable.main)
        .SetOngoing(true)
        .Build();
        StartForeground(SERVICE_RUNNING_NOTIFICATION_ID, notification);
        //do you work
        return StartCommandResult.Sticky;
    }


    void CreateNotificationChannel()
    {
        if (Build.VERSION.SdkInt < BuildVersionCodes.O)
        {
            // Notification channels are new in API 26 (and not a part of the
            // support library). There is no need to create a notification
            // channel on older versions of Android.
            return;
        }

        var channelName = Resources.GetString(Resource.String.channel_name);
        var channelDescription = GetString(Resource.String.channel_description);
        var channel = new NotificationChannel("10111", channelName, NotificationImportance.Default)
        {
            Description = channelDescription
        };

        var notificationManager = (NotificationManager)GetSystemService(NotificationService);
        notificationManager.CreateNotificationChannel(channel);
    }
}
}

有截图。(为了快速的结果,我将时间跨度设置为6秒)

enter image description here

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