Я хотел бы создать службу для «запуска» приемника SMS-сообщений Broadcast?Как я могу сделать это в Xamarin Forms (особенно в Android)?
Я изменил следующий код, чтобы решить мой вопрос.Это нативный код Android.
Я называю этот класс с DependendyServices в "Основной активности" основного проекта.
Broadcastreceiver, созданный методом "CheckForIncommingSMS" из "SMSHelper", работает нормально (такжевызывается, когда приложение работает).
using Android.App;
using Android.Content;
using Android.OS;
using Android.Util;
using System;
[assembly: Xamarin.Forms.Dependency(typeof(NAMESPACE.BackgroundServiceHelper))]
namespace NAMESPACE
{
[Service(Name = "APPNAME.BackgroundService")]
class BackgroundServiceHelper : Service, IBackgroundServiceHelper
{
static readonly string TAG = typeof(BackgroundServiceHelper).FullName;
static readonly int DELAY_BETWEEN_LOG_MESSAGES = 5000; // milliseconds
DateTime timestamper;
bool isStarted;
Handler handler;
Action runnable;
public override void OnCreate()
{
base.OnCreate();
Log.Info(TAG, "OnCreate: the service is initializing.");
timestamper = new DateTime();
handler = new Handler();
runnable = new Action(() =>
{
if (timestamper != null)
{
Log.Debug(TAG, DateTime.UtcNow.ToLongDateString());
SMSHelper smsh = new SMSHelper();
// Method wich registers the SMSReceived BrodcastReceiver
smsh.CheckForIncommingSMS();
handler.PostDelayed(runnable, DELAY_BETWEEN_LOG_MESSAGES);
}
});
}
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
if (isStarted)
{
Log.Info(TAG, "OnStartCommand: This service has already been started.");
}
else
{
Log.Info(TAG, "OnStartCommand: The service is starting.");
DispatchNotificationThatServiceIsRunning();
handler.PostDelayed(runnable, DELAY_BETWEEN_LOG_MESSAGES);
isStarted = true;
}
// This tells Android not to restart the service if it is killed to reclaim resources.
return StartCommandResult.NotSticky;
}
public override IBinder OnBind(Intent intent)
{
// Return null because this is a pure started service. A hybrid service would return a binder that would
return null;
}
public override void OnDestroy()
{
// We need to shut things down.
Log.Info(TAG, "OnDestroy: The started service is shutting down.");
// Stop the handler.
handler.RemoveCallbacks(runnable);
//timestamper = null;
isStarted = false;
base.OnDestroy();
}
void DispatchNotificationThatServiceIsRunning()
{
}
}
}