Сервис Xamarin - работает по расписанию - PullRequest
0 голосов
/ 22 апреля 2020

Я разрабатываю приложение, построенное на этом примере: https://github.com/xamarin/mobile-samples/tree/master/BackgroundLocationDemo

Пример работает, и обновления местоположения поступают, как и ожидалось. Тем не менее, Android продолжает показывать уведомление о том, что служба работает и разряжать батарею. Теперь у всех моих пользователей есть определенный график работы (список дат начала и окончания на день, например, с 8:00 до 13:00, с 16:00 до 20:00), и я хочу, чтобы служба работала только между этими рабочими часами. Это означает, что мне нужно запускать / останавливать службу всякий раз, когда в расписании говорится, что пользователь работает или нет.

Я задавал этот вопрос раньше, но мне было интересно, нашел ли кто-нибудь эффективный и solid способ достижения этот тип сервиса, который работает по расписанию?

1 Ответ

1 голос
/ 22 апреля 2020

Вы можете использовать AlarmManager для выполнения задачи в указанное c время.

Например, я хочу, чтобы моя задача выполнялась каждый день в 10:51, я могу использовать следующий код для выполнения it.

 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. enter image description here

...