安卓:无法启动服务意图:未找到?

17

我知道,我不是第一个遇到这个问题的人,但我试了很多解决方案,发现都没有用...也许你能找到错误所在。

错误消息(在其他设置中也有出现过,有些是没有 .class,有些是 /.Client)

12-02 16:40:15.359: W/ActivityManager(74): Unable to start service Intent { act=com.android.fh.EnOceanApp.Client.class }: not found

在清单文件中,这个服务被包含在应用程序中,而不是活动中(我也尝试过将其放在活动中,并使用“.Client”)。

在 onCreate() 中的代码:

    startService(new Intent(this, Client.class)); 
或者
 startService(new Intent(this.getApplicationContext(), Client.class));
Intent intent=new Intent("com.android.fh.EnOceanApp.Client.class");
    this.startService(intent);
或者
  Intent intent=new Intent("com.android.fh.EnOceanApp.Client");
    this.startService(intent);

现在,我再也没有想法了...... com.android.fh.EnOceanApp是包名,Client.java是该包中的服务类。

还有,我忘记了清单文件:

  <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".EnOceanAppActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>      
        </activity>

      <activity android:name=".ListView" 
          android:label="List View">
      </activity> 
      <activity android:name=".GraphView" 
          android:label="Graph View">
      </activity>
      <service 
            android:name=".Client"></service> //with and without ., of course without this comment
    </application>

1
在你的清单文件中声明你的服务。 - njzk2
8个回答

21

感谢用户njzk2提醒我发现了问题。

我曾经遇到过同样的问题。似乎如果你没有在项目的清单文件中先注册服务类,Android操作系统就无法找到你所请求的服务类。

请记住,服务类就像没有图形界面的活动。这意味着在使用服务之前需要先进行注册。

以下是如何在Android项目中注册服务:

<application>
    <!-- your code -->
    <activity>
        <!-- your code  -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:name="com.your.own.service.class"></service>
</application>

请记住,YourService类需要扩展自Service类,否则你的类将不会是一个服务。

public class YourService extends Service{}

3
我遇到了同样的问题,发现如果我用 "/>" 关闭标签,在应用程序升级后它无法检测到该服务,但是如果我用 "</service>" 关闭标签,那么在应用程序升级后就可以检测到它。奇怪。 - Danail
@Konstantin,我认为你只需要清除整个项目。这对我来说就是问题所在。 - Danail
@Danail 我只需要在清单文件中进行了一些小的更改,比如给任何服务添加一个标签。这似乎更新了存储在我的设备中的清单文件。之后我可以撤销我的更改。Project > Clean 也可以解决问题。这是在通过 Eclipse 更新应用程序后发生的。在更新时,由于签名不匹配,我被要求删除现有的应用程序。我这样做了。之后旧的清单文件可能仍然留在设备上,但我的新应用程序需要一个更新的清单文件。 - OneWorld

4

有时候您需要在清单文件中完全限定类名,而不是使用简写形式(.classname)。当我使用来自不同包的类时,我就见过这种情况,但或许在这里使用会更合适,因为服务意图可能会超出应用程序范围。


到目前为止,这并没有改变任何事情 :( - nico
帮了我。我的服务在不同的包中,而不是我的主要活动中。 - Tirtha
在Playstore上,com.andorid.*是受限制的(仅供参考)。 - scottyab
@scottyab,事实证明我的应用程序包名称是com.mycompany.androidapp...所以它似乎正在执行一些正则表达式,而com...android匹配并可能导致问题?我现在无法更改我的包名称...现在怎么办? - strangetimes

2

所以...只是为了最终帮助其他人或者不是:

我创建了一个新项目,复制了源代码并尝试运行它:服务现在被找到了。 有什么不同之处,换句话说:我认为可能会出现问题的原因是: 过长的包名或以 com.android.. 开头。在新项目中,我只选择了 com.enocean。


1
尽管这篇文章和许多相关的文章无法启动服务意图:未找到 无法启动服务意图,都提供了所有答案,但我仍然遇到了困难,花费了一些时间才解决。我的情况稍微有些复杂,因为我试图在不同的应用程序中启动服务。我解决了问题,并提供了所有细节,以及一些额外的代码。
调用意图的MainActivity(或其他位置)
Intent intent=new Intent("com.example.core.MusicService.1234");
//Or Intent intent=new Intent("com.example.core.MusicService.TOGGLE_PLAYBACK");
PendingIntent pendingIntent = PendingIntent.getService(this, 99, intent, PendingIntent.FLAG_CANCEL_CURRENT);

服务清单:服务(位于应用程序标签内的服务标签)

这是。
    <service android:name="com.example.core.MusicService">
        <intent-filter>
            <action android:name="com.example.core.MusicService1234"></action>
        </intent-filter>
        <intent-filter>
            <action android:name="com.example.core.MusicService.TOGGLE_PLAYBACK"></action>
        </intent-filter>
    </service>

MusicService.java

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(intent != null){
        if(intent.getAction() != null){
            if(intent.getAction().contentEquals("com.example.core.MusicService.TOGGLE_PLAYBACK")){
                //Do work here
            }
        }
    }
}

注意事项

  • 服务不需要启动,此意图将启动它
  • "com.example.core.MusicService1234"和"com.example.core.MusicService.TOGGLE_PLAYBACK"可以随意更改,但显然需要与调用意图中的服务清单中的意图过滤器匹配。您可以放置多个这样的内容,以便在您的服务开始时根据来自意图的值执行不同的操作
  • 99可以随意更改,但如果您使用通知,则必须是唯一的
  • 我不确定是否可能在不使用意图过滤器的情况下调用不同应用程序中的服务(例如此类服务)-如果是,请有人告诉我们。 我尝试过,但不起作用。

荣誉归于:所有帖子中的累积信息 :)


这个答案看起来很有趣,但是提供的解决方案中没有太多的代码可以尝试。 - Lisitso

0

我犯了一个愚蠢的错误,将<service>标签添加到清单文件中的另一个<application>中。

在这种情况下,当前应用程序无法找到定义的服务。

希望你能避免这个错误 :)

谢谢。


0

嗯,在我的情况下,我不得不清理项目。有时候,当您为包/项目中的服务创建了一个新的Java类,但之后没有构建/清理项目时,会发生这种情况。在我的情况下,我只需要清理项目就可以摆脱错误。


0
如果有人看到这篇文章并且遇到了和我一样的问题,那么可能是因为我按照指南使用了context.startService()而不是context.startActivity()

0

这是 Android 的一个愚蠢错误

这样做不会起作用

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

但这样会起作用,需要有单独的闭合标签

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接