Сохраняйте задачу работающей, когда приложение находится в фоновом режиме - PullRequest
0 голосов
/ 15 февраля 2020

Я пишу приложение для отслеживания карт в формах Xamarin. Я использую async tasks(with Device.StartTimer) для отслеживания местоположения и другую задачу для счетчика таймера, но когда мне нужно открыть другое приложение, например, приложение musi c или любое другое приложение, которое не может отслеживать, пока оно находится в фон. Все задачи останавливаются, когда я отправляю приложение в фоновом режиме. Когда я снова запускаю приложение, задачи не продолжаются. Мне просто нужно продолжать работать во время работы приложения.

Как это можно сделать?

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

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

В Android 8.0 или более поздней версии, я предлагаю вам для достижения службы переднего плана для достижения этого (получите более высокий приоритет, чем «обычная» служба, и служба переднего плана должна предоставить уведомление, которое Android будет отображаться, пока служба работает).

Службу зависимости можно использовать для открытия службы переднего плана в формах xamarin.

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

Вот аналогичная ветка о ваших потребностях. Как создать службу, выполняющую работу за период в Xamarin.Forms?

Для IOS фоновых задач. Вы можете обратиться к этой теме

1 голос
/ 15 февраля 2020

В этом случае следует использовать фоновое задание, которое выходит за пределы жизненного цикла приложения. Вы можете найти больше информации здесь Xamarin фоновые задачи

...