2013-04-30 15 views
6

Mam usługę, która jest używana/związana w wielu działaniach (ostrożnie napisałem ją, aby jedna czynność rozpięła ją, zanim inny się złączy, w trybie onPause/onResume). Jednak zauważyłem człon w Serwisie nie będzie trzymać ....Usługa Android nie działa jako singleton

Działanie 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 

Działanie 2:

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

kodu serwisowego:

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

Po zmianie jednej rzeczy - przekształceniu zmiennej downloadItems usługi w statyczną - wszystko działa idealnie. Ale to mnie martwi; Nigdy wcześniej nie używałem singletonu w ten sposób. Czy to jest poprawna metoda użycia jednego z nich?

+1

Czy dzwonisz do startService() w dowolnym miejscu swojej działalności? Dzięki temu usługa może pozostać przy życiu jako singelton. W przeciwnym razie zostanie zniszczony, gdy działalność związana z nim zostanie zniszczona. – Nospherus

+0

@Nospherus Dodam to, co zrobiłem wkrótce - tl; dr robi "bindService" działa tak samo dobrze jak "startService()"? –

+3

Nie. Musisz wywołać zarówno startService(), jak i bindService(). Jeśli wywołasz tylko bindService(), usługa umrze zaraz po odzworowaniu. Wywołując funkcję startService(), pozostanie ona aktywna, dopóki nie wywołasz funkcji stopService() (lub stopSelf() wewnątrz usługi). – Nospherus

Odpowiedz

7

Okazuje się, że Nospherus był poprawny; jedyne, co musiałem zrobić, to zadzwonić pod numer startService() obok mojego bindService() i wszystko było w porządku.

Ponieważ wiele wywołań startService() nie wywołuje konstruktora wiele razy, są one dokładnie tym, czego potrzebowałem. (. Jest to bardzo leniwy z mojej strony, ale to działa na razie jestem pewien, w jaki sposób sprawdzić, czy wstępne (i nie związany), usługi). Mój kod wygląda teraz tak:

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

Zobacz również Bind service to activity in Android

+0

woow, straciłem cały ranek szukając rozwiązania mojej dwóch instancji usługi i tutaj jest ... po prostu startService. – rcorbellini

+0

Uruchomiłbym usługę przed powiązaniem z nią, lepszą praktyką. – benchuk

Powiązane problemy