2016-05-31 6 views
2

Ich möchte eine Service implementieren, die wie ein Singleton wirkt.Intent Service Singleton

Ich brauche meine App zu überprüfen, ob der Bildschirm gesperrt ist, dann starten Sie eine ListenerIntentService. Wenn der Bildschirm entsperrt wird, wird der Listener Dienst beendet. Ich habe eine ScreenLockService erstellt, die eine IntentService ist und wird von der Home Aktivität aufgerufen, wenn der Benutzer die Ein/Aus-Box aktiviert, weil ich die Listener ausführen möchte, auch wenn die App nicht ausgeführt wird.

So die Home Aktivität läuft und stoppt den ScreenLockService Service, der ausgeführt wird und den Listener Service stoppen.

Mein Problem ist, dass die HomeActivity mehrere Instanzen von ScreenLockService erstellt, die auch mehrere Instanzen von Listener erstellt.

Also ich möchte diese beiden IntentServices als Singletons ausgeführt haben, aber ich bin mir nicht sicher, wie es geht.

Ich habe eine Reihe von Tutorials ausgecheckt, aber sie sind entweder veraltet oder nicht IntentServices zugeschnitten wie: http://www.devahead.com/blog/2011/06/extending-the-android-application-class-and-dealing-with-singleton/ Singleton in Android

Ich kann ein Beispiel-Code von Post, was ich habe, wenn nötig, aber alles was ich wirklich suche, ist ein How-To.

+4

ein 'Service' ist ein Singleton: Sie können nicht zwei Instanzen desselben' Service' haben – pskink

+0

Halten Sie den Dienst an und starten ihn in onPause, onResume Ihrer Aktivität? – Pablo

+0

@Pablo Nein, ich erstelle den 'ScreenLockService'-Intent und starte ihn im onCreate der 'Home' Aktivität. Wenn der Bildschirm dann gesperrt ist, starte ich den "Listener" -Dienst. – Ausche

Antwort

2

Nun, die Grundidee für die Implementierung der Singleton-Muster besteht darin, einen privaten [oder geschützten] Konstruktor zu erstellen (was bedeutet, dass er von außerhalb der Klasse nicht zugänglich ist). Die Klasse benötigt auch ein eigenes Feld mit einem eigenen Typ (zB private MyClass myObj;) Als nächstes brauchen Sie die öffentliche statische Methode namens newInstance(), die die Instanz der Klasse über myObj zurückgibt, wenn sie nicht null ist, und sie instanziiert, wenn sie lautet:

public static MyClass newInstance(){ 
    if (myObj == null) { 
     myObj = new MyClass(); 
    } 
return myObj; 
} 

Natürlich kann es eine komplexere Implementierung haben (der Konstruktor muss nicht ohne Parameter sein).

Jetzt wird immer genau eine Instanz der gewünschten Klasse erstellt. Alles, was Sie tun müssen, ist, die Methode newInstance an der Stelle aufzurufen, an der Sie Ihre Klasse verwenden müssen. Wenn es bereits instanziiert wurde, erhalten Sie die alte Instanz, andernfalls wird sie erstellt.

Ich hoffe, das war die Erklärung, nach der Sie gesucht haben.

+0

Diese Antwort erklärt, wie man einen Java Singleton implementiert (allgemein). Die Frage lautete, Android-Dienste als Singleton zu implementieren. – Pablo

+0

Wahrscheinlich genauso, ich sehe nicht, warum es anders wäre. – Vucko

+0

Wie @pskink sagte, Sie können nicht zwei Instanzen desselben Dienstes haben. – Pablo