Mit Service als singleton in Android
Ist es eine schlechte Praxis zu erstellen Service
das funktioniert als singleton? Ich meine ein Service
ist, nie aufgehört, und enthält einige private Daten, dass einige andere Motoren Activities
verwenden würde, so die Service
haben könnte, so etwas wie:
public class CustomService extends Service {
private List<Profile> mProfiles;
private static CustomService instance;
public static CustomService getInstance() {
if(instance == null) {
instance = new CustomService();
}
return instance;
}
public List<Profile> getProfiles() {
return mProfiles;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
}
...
}
Dem Grund zu tun, eine Service
statt nur ein singleton ist, dass es arbeiten muss, unabhängig von der Anwendung, als wenn es beginnt, die es verbindet, eine websocket-das sollte nie geschlossen werden und hängen nicht von der Anwendung. Was würden Sie mir empfehlen zu tun? Gibt es einen besseren Weg, um re-nutzen Sie die Service
um einige Daten (zum Beispiel die mProfiles
array) von anderen Motoren und Activities
?
Habe ich irgendwo gelesen, dass ein Service
funktioniert wie ein singleton, aber ich weiß nicht, wie Zugriff auf die privaten Variablen von jedem anderen Punkt in der Anwendung.
- Soweit ich weiß sollte man nicht, erstellen Sie eine service-Instanz selbst, sondern verwenden sollten
startService()
mit einem Kontext. Ich bin mir nicht sicher, was die Folgen der Verwendungnew CustomService();
- Hi, danke für deine Antwort. Aber startService startet den Dienst und rufen Sie die onStartCommand, aber das ist nicht das, was ich will. Ich will den Dienst starten, nachdem Sie auf Antrag der onCreate-Methode, und dann von jedem anderen Punkt der Anwendung einer privaten variable des service
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist überflüssig und in der Art, wie Sie Sie vorschlagen, nicht zur Arbeit zu gehen aus der Sicht der
Android
Service
als Anwendungskomponenten, die zur Erfüllung seiner Funktionen mit Bezug aufApplication
Lebenszyklus, der in seiner wiederum, beeinflusst durchSolche Absicht einer Anwendungskomponente wird erreicht, indem
AndroidManifest.xml
,Application
und "anfügen" esApplicationThread
/ActivityThread
.Sagte, bringt die Tatsache, dass Komponenten der Anwendung gebunden werden, um die
Application
- Instanz gehostet werden, die von OS Prozess-und können nicht unabhängig voneinander laufen.Bezüglich Ihrem Ansatz, es gibt zwei Szenarien:
1.
CustomService
's Standard Konstruktor ist private gemäß der Muster.Durch den Aufruf
getInstance()
eine einzelne Instanz vonCustomService
erstellt. Die Instanz ist nur eineJava
Objekt (singleton), die nichts gemein hat mitAndroid
Service
application-Komponente. DieonStart()
,onStartCommand()
etc. Methoden, die nie aufgerufen werden, durch das system.Einen Versuch zu starten, den "Dienst" (im manifest deklariert) mit
startService(Intent)
fehl mitIllegalAccessException: access to constructor not allowed
.2.
CustomService
's Standard Konstruktor ist public (laut Kodex).Wenn der Dienst deklariert ist
AndroidManifest
und der default-Konstruktor ist leer,startService()
wird nicht fehlschlagen, abergetInstance()
erstellen einer anderen Instanz vonCustomService
, die nicht behandelt werden, alsAndroid
Service
application-Komponente.Dies ist kein singleton.
Verwenden
Service
als pro die Dokumentation und wählen Sie die Art von Kommunikation, die Sie brauchen:Activity
-->
Service
) - verwenden Sie eine begonnenService
und behandeln jedenIntent
(mit Ihren Daten verbunden, wiemProfiles
im FalleProfile
Klasse implementiertParcelable
) inonStartCommand()
;Activity
<->
Service
) - verwenden Sie eine gebundenService
und kommunizieren überIBinder
.Schließlich
Service
imAndroid
ist ein singleton. Es gibt nur eine Instanz der einzelnen Dienste im system. Es startet bei Bedarf und behandelt alle anstehendenIntent
s /gebundene Kunden. Sobald es fertig ist, oder explizit beendet wird, wird es zerstört werden.Seine schlechte Praxis, einen Dienst zu erstellen, wie ein singleton.Beginnen Sie Ihren service klebrig und Sie können rufen Sie Ihren service, indem Sie Ihren Namen und überprüfen, ob seine arbeiten oder nicht mit dem folgenden code in einer Aktivität.
Wenn (und ich habe nicht gefunden, die Dokumentation zur Unterstützung dieser aber annehmen, dass es der Fall ist) der Service ist instanziert nur einmal durch das Android-framework, dann könnten Sie initialisieren
instance
innenService.onCreate
. Der einzige Nachteil ist, dass Sie nicht haben eine Garantie, wenn diese aufgerufen wird. I. e., wenn Sie call startService innenApplication.onCreate
werden Sie wahrscheinlich haben, um ein bisschen warten, bevor Sie Ihren Dienst wirklich instanziert.