2013-04-30 4 views
6

J'ai un service qui est utilisé/lié dans plusieurs activités (je l'ai écrit avec soin pour qu'une activité le délie avant qu'une autre se lie, dans onPause/onResume). Cependant, j'ai remarqué un membre du service ne colle pas ....Le service Android ne fonctionne pas en tant que singleton

Activité 1:

private void bindService() { 
    // Bind to QueueService 
    Intent queueIntent = new Intent(this, QueueService.class); 
    bindService(queueIntent, mConnection, Context.BIND_AUTO_CREATE); 
} 

... 

bindService(); 

... 

mService.addItems(downloads);  // the initial test adds 16 of them 

Activité 2:

bindService();        // a different one than activity 1 
int dlSize = mService.getQueue().size(); // always returns 0 (wrong) 

Code de service:

public class QueueService extends Service { 
    private ArrayList<DownloadItem> downloadItems = new ArrayList<DownloadItem(); 

    // omitted binders, constructor, etc 

    public ArrayList<DownloadItem> addItems(ArrayList<DownloadItem> itemsToAdd) { 
     downloadItems.addAll(itemsToAdd); 
     return downloadItems; 
    } 

    public ArrayList<DownloadItem> getQueue() { 
     return downloadItems; 
    } 
} 

En changeant une chose - en transformant la variable downloadItems du service en une variable statique - tout fonctionne parfaitement. Mais avoir à le faire m'inquiète; Je n'ai jamais utilisé un singleton de cette façon auparavant. Est-ce la bonne méthode pour utiliser l'un d'eux?

+1

Appelez-vous startService() n'importe où dans vos activités? Cela permet au service de rester en vie comme un singelton. Sinon, il sera détruit lorsque l'activité qui lui est liée est détruite. – Nospherus

+0

@Nospherus Je vais ajouter ce que j'ai fait sous peu - tl; dr "bindService" fonctionne-t-il aussi bien que "startService()"? –

+3

Non. Vous devez appeler startService() et bindService(). Si vous n'appelez que bindService(), le service mourra dès que vous l'aurez dissocié. En appelant startService(), il restera actif jusqu'à ce que vous appeliez stopService() (ou stopSelf() dans le service). – Nospherus

Répondre

7

Il s'avère que Nosphère avait raison; tout ce que j'avais besoin de faire était et startService() appel à côté de mon bindService(), et tout allait bien.

Parce que plusieurs appels startService() n'appellent pas le constructeur plusieurs fois, ils étaient exactement ce dont j'avais besoin. (. Cela est extrêmement paresseux de ma part, mais cela fonctionne pour l'instant je ne suis pas sûr de savoir comment vérifier une commencé (et non lié) service.) Mon code ressemble maintenant à ceci:

Intent queueIntent = new Intent(getApplicationContext(), QueueService.class); 
bindService(queueIntent, mConnection, Context.BIND_AUTO_CREATE); 
startService(queueIntent); 

Voir aussi Bind service to activity in Android

+0

woow, j'ai perdu ma matinée entière à la recherche d'une solution de mon deux instance de service et ici c'est ... juste startService. – rcorbellini

+0

Je commencerais le service avant de me lier à lui, une meilleure pratique. – benchuk

Questions connexes