2011-09-23 6 views
1

나는 다른 스레드를 checking if a service is running에 대해 읽었지만 이것이 나를 위해 작동하지 않습니다.언 바운드 서비스가 실행 중인지 확인하는 방법은 무엇입니까?

나의 상황은 백그라운드 웹 서버 서비스를 만들고 있지만 활동이 끝난 후에도 계속 실행되기를 원하기 때문에 바인딩하는 것이 아닙니다. 이 서비스는 사용자가 실행 중임을 알 수 있도록 알림을 생성합니다. 사용자는 액티비티의 버튼을 통해 서비스를 중지 할 수 있습니다.

이것은 활동이 시작될 때를 제외하고는 모두 잘 작동합니다. 서비스가 이미 실행 중인지 확인할 수 없습니다. 다음 사용하고 있습니다 :

if (isMyServiceRunning() == false) 
{ 
    Intent ws = new Intent(this, WebServerService.class); 
    startService(ws); 
} 

그리고이

private boolean isMyServiceRunning() { 

    String sClassName; 

    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) 
    { 
     sClassName = service.service.getClassName(); 
     DebugMsg("Service: " + sClassName); 

     if (sClassName.contains("com.<mydomain>.webservice")) 
     { 
       return true; 
     } 
    } 

    return false; 
} 

을 나는 서비스의 목록은 시스템 및 제 3 자 서비스를 모두 실행 얻을. 하지만 내 서비스가 실행 중임에도 불구하고 내 서비스가 목록에 표시되지 않습니다. 전화기의 설정 -> 응용 프로그램 -> 실행중인 서비스에 들어가면 거기에서 실행되는 것을 볼 수 있습니다.

이미 실행중인 서비스에서 startService를 호출하면 무시해야한다는 문서를 읽었습니다. 하지만 디버거에서 OnCreate와 OnStart가 모두 호출되는 것을 볼 수있는 것은 아닙니다.

백그라운드 서비스가 파일을 처리하는 중일 때마다 새 서비스를 만들지 않는 것이 중요합니다. 액티비티는 서비스와 통신 할 필요가 없습니다. 서비스가 실행 중이 아니면 시작하고 사용자가 버튼을 클릭하면 종료합니다.

내 서비스가 getRunningServices 목록에 표시되지 않는 이유에 대한 아이디어가 있으십니까?

+0

btw는 내 로컬 서비스에서 getSystemService (..) 목록을 표시합니까?! 나는 생각하지 않는다. : S – Ewoks

답변

4

1 단계 : static boolean isRunning=false을 서비스에 추가하십시오.

2 단계 : 서비스 onCreate()isRunning ~ true을 설정하십시오.

# 3 : 서비스 onDestroy()isRunning ~ false을 설정하십시오.

4 단계 : isRunning을 검사하여 서비스가 실행 중인지 확인합니다.

이미 실행중인 서비스에서 startService를 호출하면 무시해야한다는 문서를 읽었습니다. 하지만 디버거에서 OnCreate와 OnStart가 모두 호출되는 것을 볼 수있는 것은 아닙니다.

나는 startService()가 실행중인 서비스를 호출 할 때 onCreate()가 호출되지 것을 매우 확신합니다. startService() 호마다 (따라서 더 오래된 서비스의 경우 onStart())이 호출됩니다.

그것은 내가 새로운 서비스를

서비스 천연 싱글 때마다 생성하지 않는 것이 중요합니다. 정확하게 0 또는 1 개의 사본이 메모리에 저장됩니다. 2 명 이상일 수 없습니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 그러나 운은 없습니다. isRunning의 컨텍스트가 손실됩니다. OnCreate에서 true로 설정하고 두 번째로 startService를 호출 할 때 변수를 확인하면 여전히 false입니다. onCreate와 onStart는 항상 호출됩니다. 나는 심지어 모든 onCreate, onStart 및 onDestroy에 대해 증가 된 별도의 정적 카운터를 만들었습니다. startService가 호출 된 후에는 항상 0입니다. onDestroy가 호출되지 않는다는 사실에 흥미 롭습니다. –

+0

@ 그레그 리노 : 그런 다음 앱에 심각한 문제가 있습니다. 매니페스트에 'android : process' 속성이 없거나 별도의 프로세스를 필요로하는 것이 있는지 확인하십시오. – CommonsWare

+0

IntentService를 사용하여 다른 서버와 통신하는 것이 중요합니까?

0

사실, 내 서비스가 이제 서비스 목록에 나타납니다.이제 서비스를 다시 시작한 후에야 서비스 이름이 등록되지 않았을 것이라고 생각합니다. 변경하지 않았으므로 다시 시작한 후에 모든 것이 작동하고 있기 때문입니다.

+0

Uffff .. 그게 지저분 해 .. 어떻게하면 사용자가 앱을 돌릴 때 이런 일이 일어나지 않을 것이라고 확신 할 수 있을까요? ( – Ewoks

관련 문제