Одно из моих приложений делает что-то очень похожее. Чтобы активировать услугу через определенный период времени, я рекомендую postDelayed()
Есть поле обработчика:
private final Handler handler = new Handler();
и переподготовка Runnable
private final Runnable refresher = new Runnable() {
public void run() {
// some action
}
};
Вы можете запускать свои уведомления в рабочем режиме.
О сервисном построении и после каждого запуска запуска это так:
handler.postDelayed(refresher, /* some delay in ms*/);
В onDestroy()
удалить пост
handler.removeCallbacks(refresher);
Чтобы запустить службу во время загрузки, вам нужен автозапуск. Это идет в вашем манифесте
<receiver android:name="com.example.ServiceAutoStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
и ServiceAutoStarter
выглядит так:
public class ServiceAutoStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, UpdateService.class));
}
}
Остановить ОС, чтобы убить службу, довольно сложно. Также ваше приложение может иметь RuntimeException
и сбой, или ваша логика может зависнуть.
В моем случае, казалось, помогло всегда обновлять сервис на экране с BroadcastReceiver
. Поэтому, если цепочка обновлений остановится, она будет воскрешена, когда пользователь использует свой телефон.
В сервисе:
private BroadcastReceiver screenOnReceiver;
К вашим услугам onCreate()
screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Some action
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
Затем отмените регистрацию услуги на onDestroy()
с помощью
unregisterReceiver(screenOnReceiver);