无法启动服务意图


81

我有一个服务班。我将此类导出到jar,并将jar嵌入到客户端应用程序中。

需要时,我调用服务类。当我尝试执行此操作时,出现以下错误:

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

除了服务类外,我还有其他类,可以访问(创建该类的对象)在同一jar内。

我觉得我错过了配置或清单中的某些内容。

请帮我识别一下。我的代码如下:

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语句之前有一个'/',我不确定它们是否应该在那里。我认为'<'之后的空格将是您遇到问题的原因。
詹姆斯·布莱克

感谢詹姆斯的答复。这些空间是有意提供的,仅在网站中显示。在代码内部,标签内没有空格。甚至“ \”也只是为了在网站上正确显示。基本上,我在Eclipse中没有任何编译错误。仅在运行时,我才在LogCat中收到消息
Vinay,2010年

Answers:


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

亲爱的马克先生,我添加了遥控器,因为我需要从不同的应用程序访问相同的内容。在网上阅读后,我将其包括在内,以实现远程服务更好。我已根据您的建议进行了修改,现在效果很好。再次感谢。
Vinay 2010年

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的服务声明OUTSIDE!

对:

<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
这听起来像是完成了这些简单错误的增强型android皮棉的工作!我们可能最终会得到。
Ehtesh Choudhury 2012年

1
我在xml中拼错了服务名称!这为我提供了问题所在的线索。thanx
Arvand

感谢您发布答案。这终于解决了服务无法启动的问题。
pmont

哇!非常感谢。为什么在<application>标记中不起作用?
Ruchir Baronia 2015年

IDE不会抱怨拼写错误的<service>标记。我们也犯了错误。
杨杨

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
带点还是不带点?在我的情况:不是,相反我使用<服务机器人:名字=“服务” />,它works.see stackoverflow.com/questions/2265020/...
DiveInto

带点,它也应该起作用,因为在顶部您定义了包裹路径
Jianhong

3
杜德,非常感谢您的回答。我一直在努力应对一个严酷的问题,结果证明我的服务使用的是其他包装。如果我能拥抱你,我会的!
racl101 2012年

1
第二点帮助。非常感谢兄弟,尝试将其破解为一整天:(。傻了
Archie.bpgc 2012年

5

我希望我也可以向某人提供此信息:我将服务类移到了另一个包中,并修复了引用。该项目非常好,但是活动无法找到服务类。

通过查看logcat的登录信息,我注意到了有关该问题的警告:该活动找不到服务类,但有趣的是,该程序包不正确,其中包含“ /”字符。编译器正在寻找

com.something./service.MyService

代替

com.something.service.MyService

我将服务类从软件包中移出,然后又移回去,一切正常。


首先,我认为/是一个错误,但如果您继续查看logcat条目,将会看到很多次,并且所有这些应用程序都可以正常运行。
Axxiss

1
好吧,我不能否认您的经验,但是我的有所不同,通过从包中移入和移出类,eclipse修复了自己的错误;
sataniccrow 2012年

2
我不得不说它也对我有用。奇怪的问题,我花了半个小时才找到我们的评论。谢谢!
亚历克斯RR

我认为我也有同样的问题,但我无法通过移动类文件来解决问题……
2012年

这是我特别的问题。很难弄清楚,但是服务名称中的/是一个线索。如果您的服务突然停止工作或无法重新结帐,则很可能是原因(和解决方案)。
海耶斯·豪根

0

就我而言,通过Intent进行数据传输的最大上限为1 MB。我将只使用缓存或存储。


0

我发现了同样的问题。我花了将近一天的时间来尝试从OnClickListener方法启动服务-onCreate在1天之后,我仍然失败了!!!很沮丧!我在看示例示例RemoteServiceController。他们的作品有效,但我的实现无效!

对我有用的唯一方法是从内部onCreate方法。其他变体都没有起作用,并且相信我我已经尝试了所有它们。

结论:

  • 如果您将服务类与mainActivity放在不同的包中,则会遇到各种错误
  • 另外,一个“ /”找不到服务的路径,尝试以Intent(package,className)和什么也没有开始,还有其他类型的Intent开始

  • 我将服务类移到了活动“最终形式”的同一包中

  • 希望这可以通过onClickonCreate方法内部定义侦听器来帮助某人,如下所示:

    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
    

对于清单文件也非常重要,请确保服务是应用程序的子级:

<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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.