2013-04-30 42 views
6

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?

+1

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

+0

@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()"? –

+3

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

Trả lời

7

Hóa ra Nospherus là chính xác; tất cả những gì tôi cần làm là gọi một cuộc gọi startService() bên cạnh số bindService() của tôi và tất cả đều tốt.

Vì nhiều cuộc gọi startService() không gọi hàm tạo nhiều lần, chúng chính xác là những gì tôi cần. (. Đây là cực kỳ lười biếng trên một phần của tôi, nhưng nó hoạt động cho bây giờ tôi không chắc chắn làm thế nào để kiểm tra các dịch vụ bắt đầu (và không bị ràng buộc).) Mã của tôi bây giờ trông như thế này:

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

Xem thêm Bind service to activity in Android

+0

woow, tôi mất toàn bộ buổi sáng của tôi tìm kiếm một giải pháp của hai trường hợp dịch vụ của tôi và ở đây nó là ... chỉ startService. – rcorbellini

+0

Tôi sẽ startService trước khi ràng buộc với nó, thực hành tốt hơn. – benchuk

Các vấn đề liên quan