Utilisez le Service en tant que singleton dans Android
Est-ce une mauvaise pratique pour créer un Service
qui fonctionne comme un singleton? Je veux dire un Service
qui n'a jamais cessé et qui contient certaines données privées que certains autres moteurs et Activities
serait d'utiliser, de sorte que le Service
pourrait avoir quelque chose comme:
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) {
...
}
...
}
La raison de faire un Service
au lieu de seulement un singleton, c'est qu'il doit fonctionner indépendamment de l'application, comme quand il démarre, il se connecte à un websocket qui ne devrait jamais être fermé et ne dépendent pas de l'application. Que suggéreriez-vous de moi? Est-il une meilleure façon d'utiliser de nouveau le Service
afin de disposer de certaines données (par exemple la mProfiles
tableau) disponibles à partir d'autres moteurs et Activities
?
J'ai lu quelque part qu'un Service
fonctionne comme un singleton, mais je ne sais pas comment accéder aux variables privées de tout autre point dans l'application.
startService()
à l'aide d'un contexte. Je ne sais pas quelles sont les conséquences de l'utilisation de new CustomService();
Salut, je vous remercie pour votre réponse. Mais startService va démarrer le service et appeler la onStartCommand, mais ce n'est pas ce que je veux. Je veux démarrer le service une fois, sur l'application de la méthode onCreate, et puis à partir de n'importe quel point de l'application d'une variable privée du service
OriginalL'auteur FVod | 2016-01-26
Vous devez vous connecter pour publier un commentaire.
Il est redondant et dans la façon dont vous le suggérez, ne va pas au travail du point de vue de
Android
Service
en tant que composant de l'application qui exerce ses fonctions àApplication
cycle de vie qui, à son tour, touché parUne telle intention d'un composant d'application est atteint par
AndroidManifest.xml
,Application
et "attachant" àApplicationThread
/ActivityThread
.Cela dit, amène au fait que les composants de l'application sont liés à la
Application
instance hébergée par le processus du système d'exploitation et ne pouvez pas exécuter de façon indépendante.Concernant votre approche, il y a deux scénarios:
1.
CustomService
par défaut de constructeur est privé selon le modèle.En appelant
getInstance()
une seule instance deCustomService
est créé. L'instance est juste unJava
objet (singleton) qui n'a rien en commun avecAndroid
Service
composant de l'application. LeonStart()
,onStartCommand()
etc. les méthodes ne sera jamais appelée par le système.Une tentative de démarrer le "service" (déclaré dans le manifeste) avec
startService(Intent)
échouera avecIllegalAccessException: access to constructor not allowed
.2.
CustomService
par défaut de constructeur public (comme par le code affiché sur le site).Si le service est déclaré dans
AndroidManifest
et le constructeur par défaut est vide,startService()
ne manqueront pas, cependantgetInstance()
permettra de créer une autre instance deCustomService
qui ne seront pas traités comme desAndroid
Service
composant de l'application.Ce n'est pas un singleton.
Utilisation
Service
comme par la documentation et de choisir le type de communication que vous avez besoin de:Activity
-->
Service
) - utiliser un commencéService
et la poignée de chaqueIntent
(avec vos données attaché à elle, commemProfiles
en casProfile
classe implémenteParcelable
) dansonStartCommand()
;Activity
<->
Service
) - utiliser un liéService
et de communiquer parIBinder
.Enfin,
Service
dansAndroid
est un singleton. Il n'y a qu'une seule instance de chaque service dans le système. Il commence sur la demande et s'occupe de toutes dans l'attente deIntent
s /lié clients. Une fois que c'est fait ou explicitement arrêté, il sera détruit.Je ne sais pas ce que vous entendez par "moteur", mais si vous avez
Context
à votre disposition, vous pouvez démarrer/lier à un Service. Une fois lié, vous pouvez envoyer toutes les données qui implémente Parcelable via IBinder, y compris de la CIB. Si vous n'avez pas de Contexte autour, il n'y a pas beaucoup que vous pouvez faire (je ne sais pas votre cas d'utilisation)... Mon meilleur conseil est de lire les docs officielles (il est bien écrit pour Android) où, en particulier, vous pouvez trouver un exemple de l'Activité de Service de communication.OriginalL'auteur Onik
Ses mauvaises pratiques pour créer un service comme un singleton.Vous pouvez commencer à votre service collant et vous pouvez récupérer votre service en son nom et de vérifier si sa fonctionne ou pas avec le code suivant à partir de l'intérieur d'une activité.
OriginalL'auteur Mohamed
Si (et je n'ai pas trouvé de documentation à l'appui de cette mais supposons que c'est le cas), le Service est instanciée qu'une seule fois par l'Androïde cadre, vous pouvez initialiser
instance
à l'intérieur deService.onCreate
. Le seul inconvénient étant que vous n'avez pas de garantie quand ce sera appelée. I. e., si vous appelez startService à l'intérieur deApplication.onCreate
, vous aurez plus de chances de devoir attendre un peu avant que votre service est en fait instanciée.OriginalL'auteur mbonnin