2017-12-31 48 views
-1

Ich habe einen Dienst, der jedes Mal gestartet wird, wenn ich meine Anwendung starte oder das Gerät neu startet, aber ich habe kürzlich festgestellt, dass der Dienst mehrmals gleichzeitig ausgeführt werden kann genannt, stapelt es sich einfach auf und schließlich wird der Batterieverbrauch wahnsinnig.Überprüfen, ob der gestartete Dienst bereits läuft

Kann jemand überprüfen, ob ein Dienst bereits läuft? Hier

ist der Code für das Starten des Service:

intent = new Intent(Application.Context, typeof(NotificationService)); 
Application.Context.StartService(intent); 

Sein in der MainActivity Klasse in der OnCreate Funktion aufgerufen, nachdem alle anderen Code innerhalb der Funktion erfolgt.

Die Serviceklasse ist wie folgt:

[Service (Label = "ITMNotificationService")] 
class NotificationService : Service 
{ 
    ... 

    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     base.OnStartCommand(intent, flags, startId); 

     ... 

     UpdateNotification(); 

     return StartCommandResult.Sticky; 
    } 

    public override IBinder OnBind(Intent intent) 
    { 
     // This is a started service, not a bound service, so we just return null. 
     return null; 
    } 
} 

Innerhalb eine Aufgabe, die ich jede X Zeit hätte ausgeführt wird:

private void UpdateNotification() 
    { 
     Task.Delay(updateTimer).ContinueWith(t => 
     { 
      ... 

      UpdateNotification(); 

     }, TaskScheduler.FromCurrentSynchronizationContext()); 
    } 

ich nur eine Instanz des Dienstes haben will, gibt es seit Es gibt keinen Grund, mehrere zu haben und es ist nur die Batterie.

Alles, was ich denke, ist relevant für den Service, den ich hier hinzugefügt habe, wenn etwas fehlt, bitte informieren Sie mich.

Antwort

1

Ihr Dienst hat nur eine Instanz, wenn er mehrmals gestartet wird - mehrere Aufrufe an startService().

Sie erhalten für jede startService() Anruf eine entsprechende onStartCommand Rückruf, aber es wird auf der gleichen Instanz sein, Android wird nicht mehrere Instanzen der gleichen Dienstkomponente erstellen.

class NotificationService : Service 
{ 
    ... 
    boolean isStarted = false; 
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId) 
    { 
     base.OnStartCommand(intent, flags, startId); 

     ... 

     if (!isStarted) { 
      isStarted = true; 
      UpdateNotification(); 
     } 

     return StartCommandResult.Sticky; 
    } 

public override IBinder OnBind(Intent intent) 
{ 
    // This is a started service, not a bound service, so we just return null. 
    return null; 
} 

}

+0

Ich habe eine Aufgabe in meinem Dienst der Suche war, die einen Aufruf einer Funktion (en) alle X Sekunden macht, könnte es die Aufgabe sein, die gestapelt wird? Ich erhalte zum Beispiel 5 oder mehr Male (abhängig von der gestarteten Zeit und Zeiten) Updates einer Statistik statt einmal pro Sekunde. – Nevaran

+0

Ihr Code in onStartCommand muss behandelt werden, wenn sie aufgerufen wird, wenn Ihre Aufgabe bereits ausgeführt wird. – elmorabea

+0

Irgendeine Idee, wie man das macht? Ich bin sehr neu in Android-Entwicklung - weniger als einen Monat. – Nevaran

0

Dank @elmorabea habe ich eine public static bool isStarted; in der Serviceklasse hinzugefügt, auf diese Weise können Sie überprüfen, ob ein Dienst gestartet wird oder nicht.

als sein einfacher Es stellte sich heraus versucht, etwas Phantasie android-basierte Code zu finden, die ich für

Verwandte Themen