Tôi có dịch vụ đang được sử dụng/bị ràng buộc trong nhiều hoạt động (tôi đã viết cẩn thận nó để một hoạt động sẽ hủy liên kết trước khi một hoạt động khác liên kết, trong onPause/onResume). Tuy nhiên, tôi nhận thấy một thành viên trong Dịch vụ sẽ không dính ....Dịch vụ Android không hoạt động như một singleton
Hoạt động 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
Hoạt động 2:
bindService(); // a different one than activity 1
int dlSize = mService.getQueue().size(); // always returns 0 (wrong)
mã dịch vụ của:
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;
}
}
Khi thay đổi một điều - làm cho biến downloadItems của dịch vụ thành một biến tĩnh - mọi thứ hoạt động hoàn hảo. Nhưng phải làm điều đó làm tôi lo lắng; Tôi chưa bao giờ sử dụng một singleton theo cách này trước đây. Đây có phải là phương pháp chính xác khi sử dụng một trong các phương pháp này không?
Bạn có gọi startService() ở bất kỳ đâu trong hoạt động của mình không? Điều này cho phép các dịch vụ ở lại còn sống như một singelton. Nếu không, nó sẽ bị phá hủy khi hoạt động liên kết với nó bị phá hủy. – Nospherus
@Nospherus Tôi sẽ thêm những gì tôi đã làm ngay - tl; dr không "bindService" làm việc cũng như "startService()"? –
No. Bạn phải gọi cả startService() và bindService(). Nếu bạn chỉ gọi bindService(), thì dịch vụ sẽ chết ngay sau khi bạn hủy liên kết nó. Bằng cách gọi startService(), nó sẽ vẫn còn sống cho đến khi bạn gọi stopService() (hoặc stopSelf() bên trong dịch vụ). – Nospherus