无法启动服务意图

Posted

技术标签:

【中文标题】无法启动服务意图【英文标题】:Unable to start Service Intent 【发布时间】:2011-03-27 05:52:03 【问题描述】:

我有一个服务类。我已将此类导出到 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   

客户端清单.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>

提前致谢, 维奈

【问题讨论】:

我尝试修复您的代码,但在源代码中存在一些问题,我觉得我对尝试的理解不够。基本上你在中有一个额外的空间,它应该是,但是如果你查看源代码,你在两个import语句之前有一个'/',我不确定它们是否应该在那里。我认为“ 感谢詹姆斯的回复。这些空间是故意只在网站上显示的。在代码内部,标签内没有空格。即使是“\”也只是为了在网站上正确显示。基本上,我在 eclipse 中没有任何编译错误。仅在运行时,我在 LogCat 中收到消息 【参考方案1】:

对于遇到此线程的其他任何人,我遇到了这个问题并且正在拔头发。 我在 '' 结束标记 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="..." />

【讨论】:

这听起来像是增强 android lint 的工作,它可以识别这些简单的错误!我们最终可能会得到。 我在 xml 中拼错了服务名称!这让我知道问题出在哪里。谢谢 感谢您发布您的答案。这终于解决了服务没有启动的问题。 哇!非常感谢。为什么它在 标签中不起作用? IDE 不会抱怨 标签拼写错误。我们也犯了错误。【参考方案2】:

首先,您不需要android:process=":remote",所以请删除它,因为它只会占用额外的内存而没有任何好处。

第二,由于&lt;service&gt;元素包含一个动作字符串,使用它:

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

【讨论】:

尊敬的 Mark 先生,我添加了遥控器,因为我需要从不同的应用程序访问相同的内容。我在网上阅读后将其包括在内,最好实现远程服务。我根据您的建议进行了修改,现在可以正常工作了。再次感谢。 @Vinay:“我需要从不同的应用程序访问相同的内容。”你仍然不需要android:process=":remote",所以请删除它,因为它只会占用额外的内存没有好处。远程服务是通过 AIDL 提供 API 的服务,与 android:process 属性无关。这是一个示例远程服务:github.com/commonsguy/cw-advandroid/tree/master/AdvServices/…,这是该服务的相应客户端:github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… 似乎这在最新版本的 Android 上不再有效,23 个 API 有效,30 个 API 无效 @user924:基于this question that you just asked,您似乎正在尝试在另一个应用程序中启动服务。这似乎不是这个问题的场景——AFAICT,它是针对单个应用程序的。另外,这个答案已经有将近 13 年的历史了,从那时起 Android 肯定发生了变化。【参考方案3】:

1) 检查清单中的服务声明是否嵌套在应用标签中

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

2) 检查您的service.java 是否与活动在同一个包或差异包中

<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>

【讨论】:

带点还是不带点?在我的情况下:不是,而是我使用 并且它有效。请参阅***.com/questions/2265020/… 带点,它也应该可以工作,因为在顶部你定义了你的包路径 老兄,非常感谢您的回答。我一直在与一个该死的问题搏斗,结果发现我的服务在不同的包中。如果我能拥抱你,我会的! 第二点有帮助。非常感谢兄弟,尝试破解它一整天:(。虽然很傻【参考方案4】:

我希望我也可以帮助有关此信息的人: 我将我的服务类移动到另一个包中并修复了引用。项目非常好,但活动找不到服务类。

通过查看 logcat 中的日志,我注意到有关该问题的警告:活动找不到服务类,但有趣的是包不正确,它包含一个“/”字符。编译器正在寻找

com.something./service.MyService

而不是

com.something.service.MyService

我将服务类从包中移出并重新移入,一切正常。

【讨论】:

首先我认为 / 是一个错误,但如果你继续查看 logcat 条目,你会看到它很多次并且所有这些应用程序都运行良好。 好吧,我不能否认你的经历,但我的经历有点不同,通过再次从包中移入和移出类,eclipse 修复了它自己的错误;)我没有运行时异常。跨度> 我不得不说它也对我有用。奇怪的问题,我花了半个小时才找到我们的评论。谢谢! 我想我也有同样的问题,但我无法通过移动类文件来解决它... 这是我的特殊问题。很难弄清楚,但服务名称中的 / 是一个线索。如果您的服务突然停止工作或在新结帐时无法正常工作,这很可能是原因(和解决方案)。【参考方案5】:

在我的例子中,Intent 数据传输的最大上限为 1 MB。 我将只使用缓存或存储。

【讨论】:

【参考方案6】:

我发现了同样的问题。我试图从OnClickListener 方法启动服务几乎浪费了一天 - 在onCreate 之外,1 天后,我仍然失败!!!!非常令人沮丧! 我正在查看示例示例RemoteServiceController。他们的工作,但我的实现不起作用!

对我有用的唯一方法是从onCreate 方法内部。其他变体都不起作用,相信我,我都试过了。

结论:

如果您将服务类放在与 mainActivity 不同的包中,我会收到各种错误

还有一个“/”找不到服务路径,尝试以Intent(package,className)开头,什么都没有,其他类型的Intent也开始

我将服务类移到活动的同一个包中 有效的最终形式

希望这可以通过在 onCreate 方法中定义侦听器 onClick 来帮助某人,如下所示:

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>

【讨论】:

以上是关于无法启动服务意图的主要内容,如果未能解决你的问题,请参考以下文章

使用 Koin 时无法通过显式意图启动活动(Koincontext 已启动)

Android 共享意图无法启动

从网站下载 apk 时无法通过意图启动电子邮件

无法为广播意图启动应用程序

无法在 45 秒内启动意图。也许主线程在合理的时间内没有空闲?

拍照失败 java.lang.runtimeexception 无法有意图地启动服务