백그라운드 서비스 작동에 문제가 있습니다. 응용 프로그램이 닫히고 전화가 잠긴 경우에도 타이머는 초당 한 번 코드를 실행해야합니다. 앱이 열려 있거나 백그라운드에서 전화가 사용 중이면이 기능은 정상적으로 작동하지만 휴대 전화가 잠겨 있고 대기 상태 인 경우 일정 시간이 지나면 서비스가 자동으로 중지됩니다.자 마린 (안드로이드). 전화가 잠겨있는 시간이 지나면 백그라운드 서비스가 중지됩니다.
코드는 예를 모델 : http://arteksoftware.com/backgrounding-with-xamarin-forms/
이 코드 MainActivity 실행된다 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System.Threading;
using System.Threading.Tasks;
using OurAppNamespace.Classes;
using Xamarin.Forms;
namespace OurAppNamespace.Droid
{
[Service]
public class LongRunningTaskService : Service
{
CancellationTokenSource _cts;
public override IBinder OnBind(Intent intent)
{
return null;
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
_cts = new CancellationTokenSource();
Task.Run(() =>
{
try
{
//INVOKE THE SHARED CODE
var timer = new BackgroundTimer();
timer.RunBackgroundTimer(_cts.Token).Wait();
}
catch (System.OperationCanceledException)
{
}
finally
{
if (_cts.IsCancellationRequested)
{
var message = new BackgroundTimerCancelledMessage();
Device.BeginInvokeOnMainThread(
() => MessagingCenter.Send(message, "BackgroundTimerCancelledMessage")
);
}
StopSelf();
}
}, _cts.Token);
return StartCommandResult.Sticky;
}
public override void OnCreate()
{
base.OnCreate();
}
public override void OnDestroy()
{
if (_cts != null)
{
_cts.Token.ThrowIfCancellationRequested();
_cts.Cancel();
}
base.OnDestroy();
}
}
}
그리고, PCL에서 :
MessagingCenter.Subscribe<StartBackgroundTimer>(this, "StartBackgroundTimer", message =>
{
var intent = new Intent(this, typeof(LongRunningTaskService));
StartService(intent);
});
MessagingCenter.Subscribe<StopBackgroundTimer>(this, "StopBackgroundTimer", message =>
{
var intent = new Intent(this, typeof(LongRunningTaskService));
StopService(intent);
});
이것은 LongRunningTaskService 클래스이다 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace OurAppNamespace.Classes
{
public class StartBackgroundTimer { }
public class StopBackgroundTimer { }
public class BackgroundTimerMessage
{
}
public class BackgroundTimerCancelledMessage { }
public class BackgroundTimer
{
public async Task RunBackgroundTimer(CancellationToken token)
{
await Task.Run(async() =>
{
while (true)
{
token.ThrowIfCancellationRequested();
await Task.Delay(1000);
Device.BeginInvokeOnMainThread(() =>
{
MessagingCenter.Send<BackgroundTimerMessage>(new BackgroundTimerMessage(), "BackgroundTimer");
});
}
}, token);
}
}
}
그리고 BackgroundTimer 호출하면 마지막으로 코드가 실행되는 :
private static void UpdateActiveTimers()
{
MessagingCenter.Subscribe<BackgroundTimerMessage>(instance, "BackgroundTimer", message =>
{
(unrelated code)
DependencyService.Get<INotificationHandling>().UpdateTimerNotification(timeText);
}
});
}
10 분 타이머를 시작하고, 다른 전화와 다른 결과가 있습니다.
Xiaomi Redmi Note 3 Pro는 백그라운드에서 응용 프로그램으로이 코드를 실행할 수 있으며 전화기는 10 분 동안 잠겼습니다 (더 이상 테스트하지 않음).
Blackberry Priv은 백그라운드에서 앱으로 2 분 동안 정상적으로 작동하며 휴대 전화가 잠긴 후 대기 모드로 전환되면 타이머가 작동을 멈추거나 휴대 전화가 다시 켜질 때까지 알림이 더 이상 업데이트되지 않습니다. 잠금 해제가 필요하지 않음).
알림에는 타이머의 남은 시간이 표시됩니다. 휴대 전화가 잠겨있을 때 타이머가 일시 중지 된 것으로 보이고 휴대 전화가 다시 잠금 해제되면 다시 시작됩니다. 타이머에 20 분이 채로 잠기고 10 분이 지나면 전화기가 잠기면 타이머는 약 18 분 후에 다시 계산됩니다.
HOMTOM HT16은 Blackberry Priv와 동일한 동작을하지만 약 30 초 후에 타이머를 일시 중지합니다.
전화가 잠겨 있고 잠자기 상태 일 때 모든 장치에서 백그라운드 서비스가 성공적으로 실행되도록 코드를 변경하는 방법은 무엇입니까?
미리 감사드립니다.
전경 서비스 사용 : https://developer.xamarin.com/guides/android/application_fundamentals/services/foreground-services/ – SushiHangover
대단히 감사합니다! 전 서비스를 포 그라운드 서비스로 승격 시켰고 현재 작동 중입니다. 그것은 명백하게 들리지만, 우리는 그걸 생각해 내지 못했습니다. – Philippe