Один із моїх додатків робить щось дуже подібне. Щоб збудити послугу після певного періоду, я рекомендуюpostDelayed()
Майте поле обробника:
private final Handler handler = new Handler();
та оновлення Runnable
private final Runnable refresher = new Runnable() {
public void run() {
}
};
Ви можете запускати свої сповіщення в режимі запуску.
На побудові служби та після кожного виконання її запускайте так:
handler.postDelayed(refresher, );
У 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) {
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
Тоді незареєстрований вашої служби на onDestroy()
з
unregisterReceiver(screenOnReceiver);