即使应用程序关闭,Xamarin 也会为数据同步形成后台服务
Xamarin Forms Background Service For Data Sync Even If App Closes
我想创建一个 运行 处于后台的服务,即使我的应用因 Sqlite 和 mysql 的数据同步而关闭。
我尝试了一些方法,但无法实现我的目标。
如果有人能给我一个示例应用程序,即使应用程序关闭
,它也会在后台提供服务运行
谢谢
如果您想要 运行 您的后台功能,即使您的应用程序在一定时间间隔内关闭,我们也需要创建一个前台服务。我说的是 android.
首先在 Android 项目中创建一个服务 class folder.Here 我正在创建一个名为 SqlService 的服务。
[Service]
class SqlService : Service
{
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
public override IBinder OnBind(Intent intent)
{
return null;
}
/*
* This service will run until stopped explicitly because we are returning sticky
*/
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
Toast.MakeText(this, "Service started", ToastLength.Long).Show();
StartServiceInForeground();
return StartCommandResult.Sticky;
}
/*
* When our service is to be destroyed, show a Toast message before the destruction.
*/
public override void OnDestroy()
{
base.OnDestroy();
Toast.MakeText(this, "Syncing stopped", ToastLength.Long).Show();
}
void StartServiceInForeground()
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var intent = new Intent(this, typeof(MainActivity));
var channel = new NotificationChannel(CHANNEL_ID, "Service Channel", NotificationImportance.High)
{
Description = "Foreground Service Channel"
};
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.CreateNotificationChannel(channel);
var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.Immutable);
var notification = new Notification.Builder(this, CHANNEL_ID)
.SetContentTitle("My Sql App")
.SetContentText("Sql Sync is on")
.SetContentIntent(pendingIntent)
.SetSmallIcon(Resource.Drawable.sr_notification)
.SetOngoing(true)
.Build();
StartForeground(NOTIFICATION_ID, notification);
}
Device.StartTimer(TimeSpan.FromSeconds(300), () =>
{
try
{
//.. Do your sql syncing here
}
catch (Exception ex)
{
}
return true;
});
}
}
在您的 MainActivity 中,您可以使用来自共享的消息中心调用来启动服务project.We还需要创建一个通知通道。
将此添加到您的 MainActivity
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CreateNotificationChannel();
loadservice();
}
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 channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default)
{
Description = "Firebase Cloud Messages appear in this channel",
};
channel.EnableVibration(true);
channel.EnableLights(true);
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.CreateNotificationChannel(channel);
}
private void loadservice()
{
MessagingCenter.Subscribe<Object>(this, "StartLongRunningTaskMessage", (sender) => {
Intent myIntent = new Intent(this, typeof(LocationService));
this.StartService(myIntent);
});
MessagingCenter.Subscribe<Object>(this, "StopLongRunningTaskMessage", (sender) => {
Intent myIntent = new Intent(this, typeof(LocationService));
this.StopService(myIntent);
});
}
}
现在您可以从您的共享项目启动服务,比如单击按钮。
private async void Sync_Clicked(object sender, EventArgs e)
{
MessagingCenter.Send<Object>(new Object(), "StartLongRunningTaskMessage");
}
我们也可以在点击另一个按钮时停止服务,例如:
private async void Sync_Clicked(object sender, EventArgs e)
{
MessagingCenter.Send<Object>(new Object(), "StopLongRunningTaskMessage");
}
如有任何疑问,请返回。
我想创建一个 运行 处于后台的服务,即使我的应用因 Sqlite 和 mysql 的数据同步而关闭。
我尝试了一些方法,但无法实现我的目标。
如果有人能给我一个示例应用程序,即使应用程序关闭
,它也会在后台提供服务运行谢谢
如果您想要 运行 您的后台功能,即使您的应用程序在一定时间间隔内关闭,我们也需要创建一个前台服务。我说的是 android.
首先在 Android 项目中创建一个服务 class folder.Here 我正在创建一个名为 SqlService 的服务。
[Service]
class SqlService : Service
{
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
public override IBinder OnBind(Intent intent)
{
return null;
}
/*
* This service will run until stopped explicitly because we are returning sticky
*/
public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
Toast.MakeText(this, "Service started", ToastLength.Long).Show();
StartServiceInForeground();
return StartCommandResult.Sticky;
}
/*
* When our service is to be destroyed, show a Toast message before the destruction.
*/
public override void OnDestroy()
{
base.OnDestroy();
Toast.MakeText(this, "Syncing stopped", ToastLength.Long).Show();
}
void StartServiceInForeground()
{
if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
{
var intent = new Intent(this, typeof(MainActivity));
var channel = new NotificationChannel(CHANNEL_ID, "Service Channel", NotificationImportance.High)
{
Description = "Foreground Service Channel"
};
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.CreateNotificationChannel(channel);
var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.Immutable);
var notification = new Notification.Builder(this, CHANNEL_ID)
.SetContentTitle("My Sql App")
.SetContentText("Sql Sync is on")
.SetContentIntent(pendingIntent)
.SetSmallIcon(Resource.Drawable.sr_notification)
.SetOngoing(true)
.Build();
StartForeground(NOTIFICATION_ID, notification);
}
Device.StartTimer(TimeSpan.FromSeconds(300), () =>
{
try
{
//.. Do your sql syncing here
}
catch (Exception ex)
{
}
return true;
});
}
}
在您的 MainActivity 中,您可以使用来自共享的消息中心调用来启动服务project.We还需要创建一个通知通道。
将此添加到您的 MainActivity
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static readonly string CHANNEL_ID = "my_notification_channel";
internal static readonly int NOTIFICATION_ID = 100;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
CreateNotificationChannel();
loadservice();
}
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 channel = new NotificationChannel(CHANNEL_ID, "FCM Notifications", NotificationImportance.Default)
{
Description = "Firebase Cloud Messages appear in this channel",
};
channel.EnableVibration(true);
channel.EnableLights(true);
var notificationManager = (NotificationManager)GetSystemService(NotificationService);
notificationManager.CreateNotificationChannel(channel);
}
private void loadservice()
{
MessagingCenter.Subscribe<Object>(this, "StartLongRunningTaskMessage", (sender) => {
Intent myIntent = new Intent(this, typeof(LocationService));
this.StartService(myIntent);
});
MessagingCenter.Subscribe<Object>(this, "StopLongRunningTaskMessage", (sender) => {
Intent myIntent = new Intent(this, typeof(LocationService));
this.StopService(myIntent);
});
}
}
现在您可以从您的共享项目启动服务,比如单击按钮。
private async void Sync_Clicked(object sender, EventArgs e)
{
MessagingCenter.Send<Object>(new Object(), "StartLongRunningTaskMessage");
}
我们也可以在点击另一个按钮时停止服务,例如:
private async void Sync_Clicked(object sender, EventArgs e)
{
MessagingCenter.Send<Object>(new Object(), "StopLongRunningTaskMessage");
}
如有任何疑问,请返回。