Android: не удалось запустить службу. Цель: не найдено?

Я знаю, я не первый онбе с этой проблемой, но я перепробовал столько решений, я нашел, и ни одно не работает... может быть, вы могли бы найти ошибку

Ошибка (тоже приходила так без .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)); 

or

 startService(new Intent(this.getApplicationContext(), Client.class));

or

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

or

  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>

person nico    schedule 02.12.2011    source источник
comment
Объявите свою службу в своем манифесте   -  person njzk2    schedule 02.12.2011


Ответы (8)


Спасибо пользователю 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{}
person AXSM    schedule 20.10.2012
comment
У меня была та же проблема, и я заметил, что если я закрою тег с помощью /›, он не обнаружит службу после обновления приложения, но если я закрою с помощью ‹/service›, он обнаружит ее после обновления приложения. Странно. - person Danail; 17.11.2013
comment
@Константин, думаю, тебе просто нужно очистить весь проект. Это было проблемой для меня. - person Danail; 02.12.2013
comment
@Danail Мне просто нужно было внести небольшое изменение в манифест, например добавить метку к любой службе. Похоже, это обновило манифест, хранящийся на моем устройстве. Я мог бы удалить свое изменение впоследствии. Project › Clean также может помочь. Это произошло после обновления приложения через Eclipse. При обновлении меня попросили удалить существующее приложение из-за несоответствия подписи. Я так и сделал. Впоследствии старый манифест, вероятно, остался на устройстве, но для моего нового приложения требовался более новый манифест. - person OneWorld; 03.12.2014

Иногда вам нужно указать полное имя класса в манифесте, а не использовать краткую форму (.classname). Я видел это, когда использовал классы из другого пакета, но, возможно, это поможет здесь, поскольку намерение службы может выходить за пределы приложения.

person ProjectJourneyman    schedule 02.12.2011
comment
Это пока ничего не меняет :( - person nico; 03.12.2011
comment
Помог мне. У меня была услуга в пакете, отличном от моей основной деятельности - person Tirtha; 31.10.2012
comment
com.andorid.* ограничен в Playstore (просто к вашему сведению) - person scottyab; 13.11.2013
comment
@scottyab оказывается, что имя пакета моего приложения — com.mycompany.androidapp ... так что, похоже, оно выполняет какое-то регулярное выражение, и com... * android * совпадает и, вероятно, вызывает проблемы? Я не могу изменить имя своего пакета сейчас .. что теперь? - person strangetimes; 26.11.2016

Итак.. просто чтобы в конечном итоге помочь другим или нет:

Сделал новый проект, скопировал исходники и попробовал запустить: теперь сервис нашелся. В чем была разница, или другими словами: что, я думаю, могло вызвать проблемы: длинное имя пакета или начало с com.android... В новом проекте я просто выбрал com.enocean

person nico    schedule 04.12.2011

Несмотря на ВСЕ ответы в этом посте и многие связанные Не удалось запустить службу Намерение: не найдено Не удалось запустить сервисное намерение , я все еще боролся, и это заняло некоторое время для меня, чтобы получить это происходит. Мой сценарий был немного сложнее, так как я пытаюсь запустить службу в ДРУГОМ приложении, чем то, с которым я ее вызываю. Я разобрался, и вот ВСЕ детали, а также бонус-код.

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 может быть любым, но оно должно быть уникальным, если вы используете уведомления.
  • Я не уверен, что можно вызвать службу в другом приложении (например, этом) без использования фильтра намерений - если это так, кто-нибудь, пожалуйста, просветите нас. Я пробовал, и это не работает.

Кредит: совокупная информация из всех сообщений :)

person Kevin    schedule 17.01.2015
comment
этот ответ выглядит интересно, но не так много кода, чтобы попробовать предоставленное решение - person Lisitso; 22.04.2015

Я сделал глупую ошибку, добавив тег в отдельный файл в манифесте.

В этом случае текущему приложению не удалось найти указанную службу.

Надеюсь, вы пропустите эту ошибку :)

Спасибо.

person Otpidus    schedule 14.03.2014

Это глупая ошибка андроида

так не пойдет

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

Но это будет работать, есть отдельный закрывающий тег

<service
            android:name=".classname"></service>
person arun-r    schedule 12.02.2015

Ну, в моем случае мне пришлось очистить проект. Иногда это происходит, когда вы создали новый класс Java для службы в своем пакете/проекте, но не собрали/очистили послесловие проекта. В моем случае мне просто нужно было очистить проект, чтобы избавиться от ошибки.

person kzs    schedule 01.03.2015

Если кто-то увидит это и у него будет та же проблема, что и у меня, то это потому, что я следовал руководству и использовал context.startService() вместо context.startActivity().

person JamEngulfer    schedule 29.04.2016