【问题标题】:Android: unable to start service intent: not found?Android:无法启动服务意图:未找到?
【发布时间】:2011-12-02 16:54:44
【问题描述】:

我知道,我不是第一个遇到这个问题的onbe,但是我尝试了很多解决方案,我找到了,没有一个有效...也许你能找到错误

该错误(在没有 .class 和 /.Client 的情况下也会出现,具体取决于其他设置)

12-02 16:40:15.359:W/ActivityManager(74):无法启动服务 意图 { act=com.android.fh.EnOceanApp.Client.class }:未找到

在清单中,这包含在应用程序中,在活动之外(也在活动中和“.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>

【问题讨论】:

  • 在清单中声明您的服务

标签: java android service classnotfound


【解决方案1】:

感谢用户 njzk2 让我注意到发生了什么。

我也遇到了同样的问题。如果您之前没有在项目的清单文件中注册,Android OS 似乎无法找到您请求的服务类。

请记住,服务类似于活动,但没有图形界面。这意味着服务需要注册才能使用它们

这是您在 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{}

【讨论】:

  • 遇到了同样的问题,注意到如果我用“/>”关闭标签,在应用升级后它不会检测到服务,但如果我用“”关闭,那么它应用程序升级后检测到它。怪异的。
  • @Konstantin,认为您只需要清除整个项目。这就是我的问题。
  • @Danail 我只需要在 Manifest 中做一个小改动,比如为任何服务添加标签。这似乎更新了存储在我设备中的清单。之后我可以删除我的更改。 Project > Clean 也可以解决问题。它发生在通过 Eclipse 更新应用程序之后。在更新时,由于签名不匹配,我被要求删除现有的应用程序。我这样做了。之后旧的 Manifest 可能会留在设备上,但我的新应用需要更新的 Manifest。
【解决方案2】:

有时您需要在清单中完全限定您的类名,而不是使用缩写形式 (.classname)。当我使用来自不同包的类时,我已经看到了这一点,但也许在这里会有所帮助,因为服务意图可能会超出应用程序。

【讨论】:

  • 到目前为止这并没有改变任何东西:(
  • 帮助了我。我的服务与我的主要活动不同
  • com.andorid.* 在 Playstore 上受限(仅供参考)
  • @scottyab 原来我的应用程序包名称是 com.mycompany.androidapp ... 所以它似乎正在执行一些正则表达式并且 com...*android* 匹配并且可能导致问题?我现在不能更改我的包名.. 现在怎么办?
【解决方案3】:

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

我创建了一个新项目,复制了源代码并尝试运行它:现在找到了服务。 有什么区别,或者换句话说:我认为什么可能会带来问题: 长包名或以 com.android.. 开头。在新项目中我只是选择了 com.enocean

【讨论】:

    【解决方案4】:

    尽管这篇文章中有所有答案以及许多相关的 Unable to start service Intent: not found Unable to start Service Intent ,但我仍然很挣扎,我花了一些时间来完成这项工作。我的情况稍微复杂一些,因为我试图在我调用它的不同应用程序中启动一项服务。我想通了,这里是所有细节,以及一些奖励代码。

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

    Manifest: 服务(应用标签内的服务标签) 这是

        <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 可以是任何您想要的,但如果您使用通知,则必须是唯一的
    • 我不确定是否可以在不使用意图过滤器的情况下在不同的应用程序中调用服务(像这样) - 如果是,请赐教。我试过了,还是不行。

    归功于:所有帖子的累积信息:)

    【讨论】:

    • 这个答案看起来很有趣,但没有太多代码可以尝试提供的解决方案
    【解决方案5】:

    我犯了一个愚蠢的错误,将标签添加到清单中的单独标签中。

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

    希望你跳过这个错误:)

    谢谢。

    【讨论】:

      【解决方案6】:

      这是android的愚蠢错误

      这行不通

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

      但这会起作用,有单独的结束标签

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

      【讨论】:

        【解决方案7】:

        好吧,就我而言,我必须清理项目。当您在包/项目中为服务创建了一个新的 Java 类但没有在之后构建/清理项目时,有时会发生这种情况。就我而言,我只需要清理项目即可摆脱错误。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-20
            • 2011-03-27
            • 2018-12-14
            • 1970-01-01
            相关资源
            最近更新 更多