2013-04-30 2 views
6

여러 활동에서 사용/바인딩되고있는 서비스가 있습니다. 하나의 활동이 onPause/onResume에서 다른 바인딩보다 먼저 바인딩 해제되도록 신중하게 작성했습니다. 그러나, 나는 달라 붙지 않는 서비스의 구성원 ....Android 서비스가 싱글 톤으로 작동하지 않습니다.

활동 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 

활동을 2 :

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

서비스의 코드 :

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

한 가지를 변경하면 서비스의 downloadItems 변수가 정적 변수가됩니다. 모든 것이 완벽하게 작동합니다. 그러나 그것을해야하는 것은 나를 걱정한다. 전에 이런 식으로 싱글 톤을 사용한 적이 없습니다. 이것들 중 하나를 사용하는 올바른 방법입니까?

+1

액티비티의 어느 곳에서나 startService()를 호출합니까? 이것은 서비스가 싱글 톤으로 살아남을 수있게합니다. 그렇지 않으면 바인딩 된 활동이 파손될 때 파기됩니다. – Nospherus

+0

@Nospherus 곧 내가 한 일을 tl; dr은 "bindService"는 "startService()"와 마찬가지로 작동합니까? –

+3

아니요. startService()와 bindService()를 호출해야합니다. bindService() 만 호출하면 서비스를 바인딩 해제하는 즉시 서비스가 종료됩니다. startService()를 호출하면 서비스 내에서 stopService() (또는 stopSelf())를 호출 할 때까지 활성 상태를 유지합니다. @Nospherus 감사합니다; – Nospherus

답변

7

Nospherus가 정확한 것으로 밝혀졌습니다. 내가해야 할 일은 모두 bindService() 옆에있는 startService() 전화 였고 모두 좋았습니다.

복수 startService() 호출이 생성자를 여러 번 호출하지 않기 때문에 필자가 필요한 것입니다. (. 이건 내 부분에 매우 게으른이지만, 지금은 작동 내가 시작 (그리고 바인딩) 서비스를 확인하는 방법에 대한 확신입니다.) 내 코드는 이제 다음과 같습니다

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

도 참조 Bind service to activity in Android

+0

와우, 전 아침 내 모든 두 가지 서비스의 해결책을 찾고 여기를 잃었습니다. 그냥 시작 서비스입니다. – rcorbellini

+0

바인딩하기 전에 startService를 사용하는 것이 더 좋습니다. – benchuk

관련 문제