Один из способов определения windows запуска (или только что запущенного) - использовать System.Envinroment.TickCount , который возвращает количество миллисекунд с момента запуска системы. Вам нужно установить переменную, чтобы указать, что вы прочитали и действовали по этому поводу, поскольку примерно через месяц она снова возвращается к нулю, поскольку у нее заканчивается свободное место для хранения такого большого числа. (РЕДАКТИРОВАТЬ - как указано, оно подписано и становится отрицательным)
int result = Environment.TickCount
, если результат меньше, чем, скажем, 300 000, то windows перезапустился за последние 5 минут. Очевидно, вам нужно спланировать, чтобы не все компьютеры быстро перезагружались.
EDIT Теперь мы знаем, что проблема заключается в том, что onStart не вызывается ... на основании комментария выше ... 1) OP Вы уверены, что устройство фактически выключается, а не просто спит / находится в спящем режиме 2) Вы проверили windows журналы событий, чтобы доказать, что служба действительно остановилась и запустилась?