gpt4 book ai didi

android - Xamarin(安卓)。手机锁定一段时间后后台服务停止

转载 作者:搜寻专家 更新时间:2023-11-01 09:32:11 27 4
gpt4 key购买 nike

我们在运行后台服务时遇到了一些问题。即使应用程序关闭并且手机被锁定,计时器也应该每秒执行一次代码。只要应用程序处于打开状态或处于后台并且手机正在使用中,此功能就可以正常工作,但是当手机处于锁定和待机状态时,服务会在一段时间后自动停止。

代码仿照此示例:http://arteksoftware.com/backgrounding-with-xamarin-forms/

这段代码在MainActivity中执行:

        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 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 中:

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分钟时,不同的手机会有不同的结果。

小米Redmi Note 3 Pro在应用程序后台锁定10分钟后可以执行此代码(不再测试)。

Blackberry Priv 在应用程序处于后台且手机已锁定(然后进入待机状态)的情况下正常工作约 2 分钟,然后计时器卡住/通知不再更新,直到手机再次打开(解锁)不需要)。

通知显示计时器的剩余时间。当手机被锁定时,计时器似乎暂停并在手机再次解锁时恢复。当手机锁定且计时器还剩 20 分钟并在 10 分钟后解锁时,计时器会在大约 18 分钟时恢复计时。

HOMTOM HT16 表现出与 Blackberry Priv 相同的行为,但它会在大约 30 秒后更早地暂停计时器。

如何修改代码使后台服务在手机锁屏休眠的情况下在所有设备上成功运行?

提前致谢!

最佳答案

我要感谢 SushiHangover 的评论,使用前台服务(-> 将现有服务提升为前台服务)解决了这个问题。

关于android - Xamarin(安卓)。手机锁定一段时间后后台服务停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46154890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com