Как создать сервис, выполняющий работу в период времени в Xamarin.Forms? - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю приложение, то есть, когда приложение запускается впервые, по истечении примерно 1 часа или более оно автоматически подключается к серверу, получает данные для предварительного просмотра, даже если пользователь закрывает приложение

1 Ответ

0 голосов
/ 19 апреля 2019

Прежде всего, когда пользователь закрывает приложение, фоновые серверы не могут работать так же, как открытое приложение, оно будет закрыто системой Android.

Если приложение работает в бэкэнде, приложение Android больше не может свободно работать в фоновом режиме в Android 8.0 (уровень API 26) или выше.Когда приложение переходит в фоновый режим, Android предоставляет приложению определенное время для запуска и использования служб.По истечении этого времени приложение больше не может запускать какие-либо службы, и все запущенные службы будут прекращены.На данный момент приложение не может выполнять какую-либо работу.

Таким образом, исходя из ваших потребностей, Запуск службы на переднем плане - хороший выбор (но пользователь не может закрыть этоapplication) - сервис переднего плана полезен, когда приложение должно выполнять какую-то задачу в фоновом режиме, и пользователю может потребоваться периодически взаимодействовать с этой задачей.Служба переднего плана будет отображать постоянное уведомление, чтобы пользователь знал, что приложение выполняет фоновую задачу, а также предоставляет способ мониторинга или взаимодействия с задачей.

Вот мой код.

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());
        };
    }

Я использовал службу зависимостей, чтобы достичь forground service.

IService.cs создать интерфейс для запуска службы Android.

public interface IService
{
    void Start();
}

Затем достигнуто DependentService для запуска службы Foreground.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...