Xamarin 服务 - 运行 根据时间表
Xamarin service - run according to a time schedule
我正在开发基于此示例的应用程序:https://github.com/xamarin/mobile-samples/tree/master/BackgroundLocationDemo
示例有效,位置更新按预期进行。但是,Android 一直显示服务正在 运行 并耗尽电池的通知。现在,我所有的用户都有一个明确的工作时间表(每天的开始到结束日期时间列表,例如上午 8 点到下午 1 点,下午 4 点到晚上 8 点),我希望在这些工作时间之间只提供 运行 服务。这意味着我需要 start/stop 每当日程表显示用户是否在工作时都需要服务。
我以前问过这个问题,但想知道是否有人找到了一种有效且可靠的方法来实现这种按时间表运行的服务?
您可以使用AlarmManager
在特定时间执行任务。
例如,我想在每天的10:51上午执行任务运行,我可以使用下面的代码来执行它。
public static void startAlarmBroadcastReceiver(Context context)
{
Intent _intent = new Intent(context, typeof( AlarmBroadcastReceiver));
PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, _intent, 0);
AlarmManager alarmManager = (AlarmManager)context.GetSystemService(Context.AlarmService);
// Remove any previous pending intent.
alarmManager.Cancel(pendingIntent);
Calendar cal = Calendar.Instance;
cal.Set( CalendarField.HourOfDay, 10);
cal.Set(CalendarField.Minute, 51);
cal.Set(CalendarField.Second, 0);
alarmManager.SetRepeating(AlarmType.RtcWakeup, cal.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
}
这是关于 AlarmBroadcastReceiver
的代码。
[BroadcastReceiver(Enabled = true, Exported = false)]
public class AlarmBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
}
}
不要忘记添加以下权限。
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
这是运行 gif。
我正在开发基于此示例的应用程序:https://github.com/xamarin/mobile-samples/tree/master/BackgroundLocationDemo
示例有效,位置更新按预期进行。但是,Android 一直显示服务正在 运行 并耗尽电池的通知。现在,我所有的用户都有一个明确的工作时间表(每天的开始到结束日期时间列表,例如上午 8 点到下午 1 点,下午 4 点到晚上 8 点),我希望在这些工作时间之间只提供 运行 服务。这意味着我需要 start/stop 每当日程表显示用户是否在工作时都需要服务。
我以前问过这个问题,但想知道是否有人找到了一种有效且可靠的方法来实现这种按时间表运行的服务?
您可以使用AlarmManager
在特定时间执行任务。
例如,我想在每天的10:51上午执行任务运行,我可以使用下面的代码来执行它。
public static void startAlarmBroadcastReceiver(Context context)
{
Intent _intent = new Intent(context, typeof( AlarmBroadcastReceiver));
PendingIntent pendingIntent = PendingIntent.GetBroadcast(context, 0, _intent, 0);
AlarmManager alarmManager = (AlarmManager)context.GetSystemService(Context.AlarmService);
// Remove any previous pending intent.
alarmManager.Cancel(pendingIntent);
Calendar cal = Calendar.Instance;
cal.Set( CalendarField.HourOfDay, 10);
cal.Set(CalendarField.Minute, 51);
cal.Set(CalendarField.Second, 0);
alarmManager.SetRepeating(AlarmType.RtcWakeup, cal.TimeInMillis, AlarmManager.IntervalDay, pendingIntent);
}
这是关于 AlarmBroadcastReceiver
的代码。
[BroadcastReceiver(Enabled = true, Exported = false)]
public class AlarmBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Toast.MakeText(context, "Received intent!", ToastLength.Short).Show();
}
}
不要忘记添加以下权限。
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
这是运行 gif。