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