3

서비스를 호출하기 전에 해당 서비스가 이미 실행 중인지 찾기 위해 함수를 사용하고 있으므로 이미 실행중인 경우 서비스가 시작되지 않습니다. -서비스가 실행 중인지 여부를 확인하는 데 오류가 발생합니다

private boolean iSR() { 

     String sClassName; 

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

      if (sClassName.contains("com.abc.def.Service_name")) 
      { 

        return true; 
      } 
     } 

     return false; 
} 

그리고 별도의 프로세스에서 서비스를 실행해야합니다. 그렇지 않으면 응용 프로그램이 느려질 수 있습니다. 따라서 매니페스트 : -

<service android:name=".Service_name" android:process=":my_process" > </service> 

그러나

서비스가 실행이며, 함수가이 같은 오류를 줄 것이다라고하는 경우 : - 왜 그렇게

..java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xyz.abc/com.xyz.abc.main}: java.lang.NullPointerException 

입니까? 어떤 도움을 주셔서 감사합니다.

+1

관리자가 null이 아닌 것은 확실합니까? 거기에 수 표를 추가 할 수 있습니까? 당신이 제공 한 스택 추적에는 라인 번호가 없으며, 무슨 일이 일어나고 있는지 예측하기가 어렵습니다. – kosa

+0

예, manager가 null이 아닙니다. 서비스가 실제로 실행 중일 때 함수 (iSR())가 올바르게 true를 반환하면 "Service_name.mThis.stopSelf();"행을 실행할 때 문제가 발생합니다. ''mThis''는 공용 정적 변수입니다 (public static Service_name.mThis = null로 선언되고 'onStartCommand()'에 mThis = this 및 'onDestroy'mThis = null). –

답변

2

클라이언트에서 startService를 두 번째로 다시 시작하면 (이미 전용 프로세스가 작성되어 있고 서비스 구성 요소에서 onCreate가 호출 된 경우) 이미 시작된 서비스가 다시 시작되지 않습니다. 메모리 부족 상황에서 서비스가 중지되거나 시스템에 의해 종료되었습니다. 그러나 서비스는 onStartCommand 호출을 여러 번받습니다.

일반적으로 서비스가 실행 중인지 확인하지 않아도됩니다. 시스템은 필요할 경우 서비스를 시작하고 중지합니다.

그리고 서비스를 별도의 프로세스로 실행하면 응용 프로그램의 속도가 빨라지므로 응용 프로그램의 기본 스레드에서 많은 것을 할 수있었습니다. 하나의 프로세스가 아닌 두 개의 프로세스가있는 경우 일반적으로 응용 프로그램이 시스템에 더 큰 영향을 미치므로 결정을 다시 검토해야합니다.

관련 문제