2013-04-30 10 views
6

Ho un servizio che viene utilizzato/rilegato in molteplici attività (con cura lo ha scritto in modo che un'attività sarà sciogliere prima di un altro si lega, in onPause/onResume). Tuttavia, ho notato un membro del servizio non si attacchi ....servizio di Android non sta funzionando come un Singleton

Attività 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 

Attività 2:

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

Codice del Servizio:

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; 
    } 
} 

Cambiando una cosa - rendendo la variabile downloadItems del servizio in una statica - tutto funziona perfettamente. Ma doverlo fare mi preoccupa; Non ho mai usato un singleton in questo modo prima d'ora. È questo il modo corretto di usare uno di questi?

+1

Chiamate startService() ovunque nelle vostre attività? Ciò consente al servizio di rimanere in vita come un singelton. Altrimenti sarà distrutto quando l'attività ad essa legata viene distrutta. – Nospherus

+0

@Nospherus Aggiungerò ciò che ho fatto a breve - tl; dr fa "bindService" funziona altrettanto bene come "startService()"? –

+3

No. Devi chiamare sia startService() che bindService(). Se chiami solo bindService(), il servizio morirà non appena lo si slega. Chiamando startService(), rimarrà attivo finché non si chiama stopService() (o stopSelf() all'interno del servizio). – Nospherus

risposta

7

Si scopre che Nospherus aveva ragione; tutto quello che dovevo fare era andd una chiamata startService() accanto al mio bindService() uno, e tutto andava bene.

perché più startService() chiamate non chiamare il costruttore più volte, erano esattamente quello che mi serviva. (. Ciò è estremamente pigro da parte mia, ma funziona per il momento non sono sicuro di come verificare la presenza di un servizio avviato (e non vincolati).) Il mio codice ora assomiglia a questo:

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

Vedi anche Bind service to activity in Android

+0

woow, ho perso la mia intera mattinata alla ricerca di una soluzione dei miei due casi di servizio e qui è ... solo startService. – rcorbellini

+0

Vorrei avviareService prima di collegarlo ad esso, una migliore pratica. – benchuk

Problemi correlati