2013-04-30 24 views
6

Birden fazla etkinlikte kullanılan/bağlı bir hizmetim var (bir eylemin başka bir bağlamadan önce, onPause/onResume'de açılmasını önlemek için dikkatlice yazdım). Ancak, sokmayacağım Hizmet üyesi ....Android hizmeti bir tekil olarak çalışmıyor

Aktivite 1 fark ettik:

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 

Aktivite 2:

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

Servis'in kodu:

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

Bir şeyi değiştirdikten sonra - hizmetin downloadItems değişkenini statik olana dönüştürün - her şey mükemmel çalışır. Ama bunu yapmak zorunda olmak beni endişelendiriyor; Daha önce hiç böyle bir singleton kullanmamıştım. Bunlardan birini kullanmanın doğru yolu bu mu?

+1

Faaliyetlerinizde herhangi bir yere startService() diyor musunuz? Bu hizmetin bir singelton olarak hayatta kalmasını sağlar. Aksi halde, kendisine bağlı faaliyet yok olduğunda yok olur. – Nospherus

+0

@Nospherus Kısaca yaptığım şeyi ekleyeceğim - tl; dr "bindService" işinin yanı sıra "startService()"? –

+3

Hayır. Hem startService() hem de bindService() öğesini çağırmanız gerekir. Yalnızca bindService() yöntemini çağırırsanız, hizmet siz onu açar açmaz ölecektir. StartService() öğesini çağırarak, stopService() hizmetini (veya hizmetin içinde stopSelf()) çağırana kadar canlı kalacaktır. – Nospherus

cevap

7

Nospherus'un doğru olduğu ortaya çıkıyor; Yapmam gereken tek şey, bindService() numaramın yanında startService() çağrısıydı ve her şey yolundaydı.

Birden çok startService() çağrıları yapıcıyı birçok kez çağırmıyorsa, tam olarak ihtiyacım olan şey buydu. (. Bu benim açımdan son derece tembel, ama şimdilik çalışıyor ben başladı (ve bağlı) hizmet için nasıl kontrol edileceğini emin değilim.) Benim kod artık şöyle görünür:

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

Ayrıca bkz Bind service to activity in Android

+0

woow, bütün sabah iki hizmet örneğimin bir çözümünü aradım ve işte burada ... sadece startService. – rcorbellini

+0

Hizmete bağlanmadan önce daha iyi bir uygulama yapmalıyım. – benchuk

İlgili konular