Eine meiner Apps macht etwas sehr ähnliches. Um den Service nach einer bestimmten Zeit zu aktivieren, empfehle ichpostDelayed()
Haben Sie ein Handlerfeld:
private final Handler handler = new Handler();
und eine Auffrischung Runnable
private final Runnable refresher = new Runnable() {
public void run() {
}
};
Sie können Ihre Benachrichtigungen im Runnable auslösen.
Beim Serviceaufbau und nach jeder Ausführung wie folgt beginnen:
handler.postDelayed(refresher, );
In onDestroy()
entfernen Sie den Beitrag
handler.removeCallbacks(refresher);
Um den Dienst beim Booten zu starten, benötigen Sie einen Autostarter. Dies geht in Ihrem Manifest
<receiver android:name="com.example.ServiceAutoStarter">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
und das ServiceAutoStarter
sieht so aus:
public class ServiceAutoStarter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, UpdateService.class));
}
}
Es ist schwierig, das Betriebssystem daran zu hindern, den Dienst zu beenden. Auch Ihre Bewerbung kann eine habenRuntimeException
und abstürzen, oder Ihre Logik kann ins Stocken geraten.
In meinem Fall schien es hilfreich zu sein, den Dienst auf dem Bildschirm immer mit einem zu aktualisieren BroadcastReceiver
. Wenn die Aktualisierungskette ins Stocken gerät, wird sie wiederbelebt, wenn der Benutzer sein Telefon verwendet.
Im Dienste:
private BroadcastReceiver screenOnReceiver;
In Ihrem Dienst onCreate()
screenOnReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
}
};
registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));
Dann heben Sie die Registrierung Ihres Dienstes onDestroy()
mit auf
unregisterReceiver(screenOnReceiver);