Прежде всего, когда пользователь закрывает приложение, фоновые серверы не могут работать так же, как открытое приложение, оно будет закрыто системой 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 секунд)