无法启动服务意图
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>
提前致谢, 维奈
【问题讨论】:
我尝试修复您的代码,但在源代码中存在一些问题,我觉得我对尝试的理解不够。基本上你在对于遇到此线程的其他任何人,我遇到了这个问题并且正在拔头发。 我在 '' 结束标记 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 不会抱怨首先,您不需要android:process=":remote"
,所以请删除它,因为它只会占用额外的内存而没有任何好处。
第二,由于<service>
元素包含一个动作字符串,使用它:
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>
【讨论】:
带点还是不带点?在我的情况下:不是,而是我使用我希望我也可以帮助有关此信息的人: 我将我的服务类移动到另一个包中并修复了引用。项目非常好,但活动找不到服务类。
通过查看 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 已启动)