4

인 텐트 서비스를 호출하는 업로드 활동이 있습니다. 거기에 API 요청 호출을 처리하고 있습니다.Android : IntentService가 실행 중인지 확인하는 방법

서비스가 실행 중인지 여부를 알기 위해 업로드 태그를 표시하고 싶습니다.

나는 서비스가 실행되고 있는지 확인하려면 다음을 시도 :
public void startUploadServiceTask() { 
    if (Util.isNetworkAvailable(mContext)) { 

     if (!isMyServiceRunning(UploadDriveService.class)) { 

       startService(new Intent(mContext, 
         UploadService.class)); 

      } 
     } else { 
      Toast.makeText(mContext, 
        "Service is already running.", Toast.LENGTH_SHORT) 
        .show(); 
     } 
    } else { 
     Toast.makeText(mContext, 
       getString(R.string.please_check_internet_connection), 
       Toast.LENGTH_SHORT).show(); 
    } 
} 



private boolean isMyServiceRunning(Class<?> serviceClass) { 
    ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager 
      .getRunningServices(Integer.MAX_VALUE)) { 
     Log.e("ALL SERVICE", service.service.getClassName().toString()); 
     if (serviceClass.getName().equals(service.service.getClassName())) { 

      return true; 
     } 
    } 
    return false; 
} 

그러나 서비스 정보를 실행 작업 관리자에서

가, 내가 실행하고 의도 서비스의 클래스를 받고 있지 않다, 그래서 이것은 항상 false를 의미합니다.

API 호출에 Broadcast를 사용했습니다.

이 코드도 확인했습니다.

if(startService(someIntent) != null) { 
Toast.makeText(getBaseContext(), "Service is already running",  Toast.LENGTH_SHORT).show(); 
} else { 
Toast.makeText(getBaseContext(), "There is no service running, starting  service..", Toast.LENGTH_SHORT).show(); 
} 

그러나이 코드에서는 서비스를 확인할 때 서비스가 다시 시작되므로 서비스가 두 번 호출됩니다.

도와주세요.

+0

이것을 시도하십시오. http://stackoverflow.com/a/17591175/2798289 – Govind

+1

이것은 확실히 당신이 원하는 것입니다 : http : // stackoverflow.com/questions/7440473/android-how-to-the-intent-service-is-still-run-stopped-run-runni – Vektor88

답변

1

코드에서 활동 상태에서 서비스 상태를 얻으려고합니다. 올바른 방법은 상태를 서비스에서 제공해야한다는 것입니다.

활동이 서비스와 통신하는 여러 가지 방법이 있으며 그 반대의 경우도 있습니다. 방송 수신기를 사용할 때 서비스가 시작될 때 onHandleIntent() 메소드에서 메시지를 브로드 캐스팅 할 수 있습니다.

작업이 완료되거나 오류가 발생하면 다시 서비스 완료 이벤트를 위해 브로드 캐스트 수신기를 호출 할 수 있습니다.

좋은 자습서는 여기 link입니다.

+0

서비스가 이미 시작된 상태에서 다른 활동으로 이동하면 등 업로드 활동 및 그 시간 서비스가 실행되고 있지만 나는 어떤 응답을 얻을 질문에 내가 예제에서 동일한 코드를 사용하는 코드에 대해 작성했습니다. –

+0

그런 경우 브로드 캐스트 리시버의 상태 필드를 사용하여 서비스 상태에 따라 값을 변경할 수 있습니다. 활동에 집중할 때마다이 가치를 확인할 수 있습니다. –

+0

@SandeepSolanki : Ruchit Shah의 답변에 대한 답변으로 솔루션을 자세히 설명해 주시겠습니까? 일반적으로 방송 수신기는 활동의 onResume() 메소드에 등록되고 활동의 onPause() 메소드에서 등록이 해제됩니다. 브로드 캐스트 리시버의 등록이 해제되어있는 경우, 브로드 캐스트 리시버의 상태 필드 (사용자가 설명하는)에 값을 할당하고 활동에서 동일한 것을 가져올 수 있습니까? – Tejas

6

IntentService를 구현해야 함 onHandleIntent()이 메서드는 의도 요청을 처리하라는 요청과 함께 작업자 스레드에서 호출되며 의도 요청을 처리하는 동안 IntentService는 "활성"상태가됩니다 (낮은 메모리 및 기타 핵심 사례는 고려하지 않음). 여기에, 그러나 다만, 논리의 측면)에

생각 그리고 모든 요청이 처리 된 경우, IntentService 자체를 중지, (따라서 당신이 stopSelf (호출해서는 안) 대신에이 이론을 통해 명시 적으로)

을, 아래 로직을 시도 할 수 있습니다 :
IntentService 클래스 내에 클래스 변수를 선언하십시오.
public static boolean isIntentServiceRunning = false;

@Override  
    protected void onHandleIntent(Intent workIntent) { 
     if(!isIntentServiceRunning) { 
     isIntentServiceRunning = true; 
     } 
     //Your other code here for processing request 
} 

그리고 당신이 선택할 수있는 경우 IntentService 클래스의 onDestroy()에 는 isIntentServiceRunning = false;

그리고 IntentService가 실행되고 있는지 확인하는 isIntentServiceRunning를 사용 설정!

+0

간단 함;) – Choletski

+1

onHandleIntent()와는 다른 스레드에서 onDestroy()가 호출되므로 스레드로부터 안전하지 않습니다. 추가 코드를 synchronized() 블록으로 묶어야합니다. – howettl

+0

활동에서 서비스 인스턴스를 어떻게 가져 옵니까? 문제는 ActivityManager를 사용하는 것이지만 안드로이드 도큐먼트는 테스트와 디버깅만을위한 것이라고 설명하고 있으므로이 솔루션으로는 충분하지 않습니다. https://developer.android.com/reference/android/app/ActivityManager.html – sergiomse