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