서비스 의도를 시작할 수 없습니다.


81

서비스 클래스가 있습니다. 이 클래스를 jar로 내 보냈고 클라이언트 앱에 jar를 포함했습니다.

필요한 경우 서비스 클래스에 전화합니다. 이렇게하면 다음과 같은 오류가 발생합니다.

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found

동일한 항아리 안에있는 액세스 (해당 클래스의 개체 생성) 할 수있는 서비스 클래스와는 다른 다른 클래스가 있습니다.

내 구성 또는 매니페스트 등에서 일부를 놓친 것 같습니다.

같은 것을 식별하도록 도와주세요. 내 코드는 다음과 같습니다.

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent = new Intent () ;  
      intent.setClassName("com.sample.service" ,"com.sample.service.serviceClass") ;  
      this.startService(intent) ; // when I call this line I get the message...  
      // binding other process continue  here   
}

클라이언트 manifest.xml

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>

미리 감사드립니다,
Vinay


나는 당신의 코드를 고치려고 노력했지만 소스에는 내가 그것을 시도하기에 충분히 이해하지 못한다고 느꼈던 문제가 있습니다. 기본적으로 <service ...>에 여분의 공백이 있습니다. <service ...> 여야합니다. 그러나 소스를 보면 두 개의 import 문 앞에 '/'가 있고 확실하지 않습니다. 거기 있어야합니다. '<'뒤의 공백이 문제의 원인이라고 생각합니다.
James Black

답장을 보내 주셔서 감사합니다. 이러한 공간은 사이트에 표시하기 위해서만 의도적으로 제공됩니다. 코드 내부에는 태그 내부에 공백이 없습니다. "\"조차도 사이트에 올바르게 표시하기위한 것입니다. 기본적으로 이클립스에서 컴파일 오류가 발생하지 않습니다. 런타임에만 LogCat에서 메시지를받습니다
Vinay

답변:


48

첫째,은 필요하지 않으므로 android:process=":remote"제거하십시오. 왜냐하면 아무 이익도없이 추가 RAM을 차지하기 때문입니다.

둘째, <service>요소에 작업 문자열이 포함되어 있으므로 다음을 사용하십시오.

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

Mark 씨에게, 다른 앱에서 동일한 콘텐츠에 액세스해야하므로 리모컨을 추가했습니다. 웹에서 읽은 후에 원격 서비스를 구현하는 것이 더 낫다는 것을 포함합니다. 귀하의 제안에 따라 수정했으며 이제는 정상적으로 작동합니다. 다시 한번 감사합니다.
Vinay

2
@Vinay : "다른 앱에서 동일한 콘텐츠에 액세스해야합니다."여전히 필요하지 않으므로을 android:process=":remote"제거하십시오. 아무 이점도없이 추가 RAM을 차지하기 때문입니다. 원격 서비스는 AIDL을 통해 API를 제공하며 android:process속성 과 관련이 없습니다 . 다음은 샘플 원격 서비스입니다. github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… 다음은 해당 서비스의 해당 클라이언트입니다. github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare 2010 년

72

이 스레드를 접하는 다른 사람에게는이 문제가 있었고 머리카락을 뽑았습니다. '<application>'종료 태그 DUH!

권리:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>    

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        
</application>

<uses-permission android:name="..." />

잘못되었지만 여전히 오류없이 컴파일됩니다.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ...>
...
<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity ...>
        ...
    </activity>

</application>

    <service android:name=".Service"/>

    <receiver android:name=".Receiver">
        <intent-filter>
            ...
        </intent-filter>
    </receiver>        

<uses-permission android:name="..." />


7
이것은 이러한 간단한 실수를 포착하는 향상된 안드로이드 보푸라기를위한 직업처럼 들립니다! 결국 얻을 수 있습니다.
Ehtesh Choudhury 2012-06-07

1
xml에서 서비스 이름을 잘못 입력했습니다! 이것은 문제가 어디인지에 대한 단서를주었습니다. 고맙습니다
Arvand 2013-07-13

답변을 게시 해 주셔서 감사합니다. 이것은 마침내 서비스가 시작되지 않는 것을 해결했습니다.
pmont 2013

와! 정말 고마워. <application> 태그에서 작동하지 않는 이유는 무엇입니까?
Ruchir Baronia 2015

IDE는 철자가 잘못된 <service> 태그에 대해 불평하지 않습니다. 우리도 실수를했습니다.
Yeung

32

1) 매니페스트의 서비스 선언이 애플리케이션 태그에 중첩되어 있는지 확인

<application>
    <service android:name="" />
</application>

2) service.java활동과 동일한 패키지 또는 diff 패키지에 있는지 확인하십시오.

<application>
    <!-- service.java exists in diff package -->
    <service android:name="com.package.helper.service" /> 
</application>
<application>
    <!-- service.java exists in same package -->
    <service android:name=".service" /> 
</application>

1
점이 있는가? 제 경우에는 : 아니요, 대신 <service android : name = "service"/>를 사용하고 작동합니다. stackoverflow.com/questions/2265020/… 참조
DiveInto

점으로도 작동해야합니다. 맨 위에서 패키지 경로를 정의하기 때문입니다
Jianhong

3
야, 대답 해주셔서 감사합니다. 나는 끔찍한 문제로 씨름하고 있었고 내 서비스가 다른 패키지에 있음이 밝혀졌습니다. 내가 당신을 안을 수 있다면 나는 할 것입니다!
racl101

1
두 번째 포인트가 도움이되었습니다. 덕분에 시도 많은 형제는 1 하루 종일 :( 위해 크래킹 바보하지만.
Archie.bpgc

5

이 정보로 누군가를 도울 수 있기를 바랍니다. 서비스 클래스를 다른 패키지로 이동하고 참조를 수정했습니다. 프로젝트는 완벽했지만 서비스 클래스는 활동에서 찾을 수 없습니다.

logcat에서 로그인을보고 문제에 대한 경고를 발견했습니다. 활동이 서비스 클래스를 찾을 수 없었지만 재미있는 점은 패키지가 잘못되었고 "/"문자가 포함되어 있다는 것입니다. 컴파일러가 찾고 있던

com.something./service.MyService

대신에

com.something.service.MyService

나는 패키지에서 서비스 클래스를 옮겼다가 다시 들어 왔고 모든 것이 잘 작동했습니다.


처음에는 /가 오류라고 생각했지만 logcat 항목을 계속 보면 여러 번 볼 수 있으며 모든 앱이 완벽하게 작동합니다.
Axxiss 2012

1
글쎄, 나는 당신의 경험을 부정 할 수 없지만 내 것은 조금 달랐고 패키지에서 클래스를 다시 들어갔다 나감으로써 이클립스는 자체 실수를 고쳤습니다.) 그리고 런타임 예외는 없었습니다.
sataniccrow

2
저에게도 효과가 있었다고 말해야합니다. 이상한 문제입니다. 댓글을 찾는 데 30 분이 걸렸습니다. 감사!
Alex RR

같은 문제가 있다고 생각하지만 클래스 파일을 이동해도 문제가 해결되지 않았습니다.
seb

이것은 나의 특별한 문제였습니다. 알아 내기는 매우 어렵지만 서비스 이름의 /는 단서였습니다. 서비스가 갑자기 작동을 멈추거나 새로 결제 할 때 작동하지 않는 경우 이것이 원인 (및 해결책)이 될 수 있습니다.
Hayes Haugen 2013

0

제 경우에는 Intent에 의한 데이터 전송을위한 최대 1MB입니다. 캐시 나 스토리지 만 사용하겠습니다.


0

나는 같은 문제를 발견했습니다. OnClickListener메소드 에서 서비스를 시작하려고 거의 하루를 잃었습니다. onCreate1 일이 지난 후에도 여전히 실패했습니다 !!!! 매우 실망 스럽습니다! 샘플 예제를보고있었습니다 RemoteServiceController. 작동하지만 내 구현이 작동하지 않습니다!

나를 위해 일하는 유일한 방법은 내부 onCreate방법이었습니다. 다른 변형은 작동하지 않았으며 모두 시도해 보았다고 믿습니다.

결론:

  • 서비스 클래스를 mainActivity와 다른 패키지에 넣으면 모든 종류의 오류가 발생합니다.
  • 또한 하나의 "/"는 서비스에 대한 경로를 찾을 수 없으며로 시작 Intent(package,className)하고 아무것도 시도 하지 않았으며 다른 유형의 의도 시작도 시도했습니다.

  • 작동하는 활동 최종 양식의 동일한 패키지에서 서비스 클래스를 이동했습니다.

  • 바라건대 이것은 다음 과 같이 메소드 onClick내부에 리스터 너를 정의함으로써 누군가를 도울 것입니다 onCreate:

    public void onCreate() {
    //some code......
        Button btnStartSrv  = (Button)findViewById(R.id.btnStartService);
        Button btnStopSrv  = (Button)findViewById(R.id.btnStopService);
    
        btnStartSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                startService(new Intent("RM_SRV_AIDL"));
            }
        });
    
        btnStopSrv.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                stopService(new Intent("RM_SRV_AIDL"));
            }
        });
    
    } // end onCreate
    

Manifest 파일에 대해서도 매우 중요하므로 서비스가 애플리케이션의 하위인지 확인하십시오.

<application ... >
    <activity ... >
     ...
    </activity>
    <service
        android:name="com.mainActivity.MyRemoteGPSService"
        android:label="GPSService"
        android:process=":remote">

        <intent-filter>
             <action android:name="RM_SRV_AIDL" />
        </intent-filter>
    </service>
</application>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.