1
0
Fork 0
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
4.4 KiB

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PhilExample.Droid.Services;
using PhilExample.Droid.Utils;
using PhilExample.Services;
[assembly: Xamarin.Forms.Dependency(typeof(ForegroundCrawlService))]
namespace PhilExample.Droid.Services
{
[Service]
public class ForegroundCrawlService : Service, IForegroundCrawlService
{
private static IForegroundCrawlDelegate _crawlDelegate;
private static readonly int _notiID = 1;
private static bool _running = false;
const string NOTIFICATION_CHANNEL_ID = "1";
const string NOTIFICATION_CHANNEL_NAME = "PhilExample_noti_1";
const string NOTIFICATION_CHANNEL_DESCR = "PhilExample_foreground";
private static System.Threading.Timer _callClock;
#region IForegroundCrawlService
public void Start(IForegroundCrawlDelegate del)
{
_crawlDelegate = del;
if (_running)
UpdateNotification();
else
{
StartService();
_running = true;
}
}
public void UpdateNotification()
{
NotificationHelper.GetAndroidNotificationManager().Notify(_notiID, CreateNotification());
}
public void Stop()
{
if(_callClock != null)
{
_callClock.Dispose();
_callClock = null;
}
//StopForeground(StopForegroundFlags.Remove);
var fgIntent = new Intent(MainActivity._THIS, typeof(ForegroundCrawlService));
MainActivity._THIS.StopService(fgIntent);
_running = false;
}
#endregion
private void StartService()
{
var intent = new Intent(MainActivity._THIS, typeof(ForegroundCrawlService));
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
MainActivity._THIS.StartForegroundService(intent);
else
MainActivity._THIS.StartService(intent);
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
if (_crawlDelegate == null)
throw new NotImplementedException("Android ForegroundCrawlService.StartCommandResult");
Console.WriteLine("Starting foregorund crawl service with _notiID: " + _notiID);
NotificationHelper.CreateNotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NOTIFICATION_CHANNEL_DESCR);
//_foregroundNotification = CreateNotification();
StartForeground(_notiID, CreateNotification());
var startTimeSpan = TimeSpan.Zero;
var periodTimeSpan = TimeSpan.FromSeconds(1);
_callClock = new System.Threading.Timer((e) =>
{
Console.WriteLine("[" + DateTime.Now.TimeOfDay.ToString().Substring(0, 8) + "] (" + _notiID + ") foreground service timer call started");
_crawlDelegate.Crawl();
Console.WriteLine("[" + DateTime.Now.TimeOfDay.ToString().Substring(0, 8) + "] (" + _notiID + ") foreground service timer call finished");
}, null, startTimeSpan, periodTimeSpan);
return StartCommandResult.Sticky;
}
private Notification CreateNotification()
{
string msgTitle = _crawlDelegate.GetForegroundNotificationTitle;
string msgDescr = _crawlDelegate.GetForegroundNotificationDescription;
Intent notificationIntent = new Intent(MainActivity._THIS, typeof(MainActivity));
var onClickIntent = PendingIntent.GetActivity(MainActivity._THIS, 0, notificationIntent, PendingIntentFlags.UpdateCurrent);
var notification = new Notification.Builder(MainActivity._THIS, NOTIFICATION_CHANNEL_ID)
.SetContentIntent(onClickIntent)
.SetContentTitle(msgTitle)
.SetContentText(msgDescr)
.SetSmallIcon(Resource.Drawable.abc_ab_share_pack_mtrl_alpha)
.SetOngoing(true)
.Build();
return notification;
}
public override IBinder OnBind(Intent intent) => null;
}
}