Не удалось запустить сервисное намерение

У меня есть класс обслуживания. Я экспортировал этот класс в банку и встроил банку в свое клиентское приложение.

Когда нужно, я вызываю класс обслуживания. Когда я пытаюсь это сделать, я получаю следующую ошибку:

Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found

У меня есть другой класс, кроме класса обслуживания, к которому я могу получить доступ (создать объект этого класса), который находится внутри той же банки.

Я чувствую, что упустил что-то в своей конфигурации или манифесте или около того.

Пожалуйста, помогите мне определить то же самое. Мой код ниже:

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>

Заранее спасибо,
Винай


person Vinay    schedule 09.08.2010    source источник
comment
Я пытался исправить ваш код, но в исходном коде есть проблемы, которые, по моему мнению, я недостаточно понимаю, чтобы попытаться это сделать. По сути, у вас есть дополнительный пробел в ‹ service ...›, это должно быть ‹service ...›, но если вы посмотрите на источник, у вас есть '/' перед двумя операторами импорта, и я не уверен, что они должны быть там. Я думаю, что пробелы после «‹» будут причиной вашей проблемы.   -  person James Black    schedule 09.08.2010
comment
Спасибо, Джеймс, за ответ. Эти пробелы выделены намеренно только для отображения на сайте. Внутри кода внутри тегов нет пробелов. Даже \ предназначен только для правильного отображения на сайте. В принципе, я не получаю никаких ошибок компиляции в eclipse. Только во время выполнения я получаю сообщение в LogCat   -  person Vinay    schedule 09.08.2010


Ответы (6)


Во-первых, вам не нужен android:process=":remote", поэтому удалите его, так как все, что он будет делать, это занимать дополнительную оперативную память без какой-либо пользы.

Во-вторых, поскольку элемент <service> содержит строку действия, используйте ее:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}
person CommonsWare    schedule 09.08.2010
comment
Уважаемый мистер Марк, я добавил пульт, потому что мне нужен доступ к одному и тому же контенту из разных приложений. Я включаю это после того, как прочитал в Интернете, что лучше реализовать удаленный сервис. Я изменил в соответствии с вашим предложением, и теперь все работает нормально. Еще раз спасибо. - person Vinay; 09.08.2010
comment
@Vinay: мне нужно получить доступ к одному и тому же контенту из разных приложений. Вам по-прежнему не нужен android:process=":remote", поэтому удалите его, так как все, что он будет делать, это занимать дополнительную оперативную память без какой-либо пользы. Удаленная служба — это та, которая предлагает API через AIDL и не имеет ничего общего с атрибутом android:process. Вот пример удаленной службы: github.com/commonsguy/cw- advandroid/tree/master/AdvServices/, а вот соответствующий клиент этой службы: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ - person CommonsWare; 09.08.2010
comment
кажется, это больше не работает на последней версии Android, 23 API работает, 30 API не работает - person user924; 22.05.2021
comment
@user924: на основе этого вопроса, который вы только что задали, похоже, вы пытаетесь запустить службу в другом приложении. Это не похоже на сценарий из этого вопроса - AFAICT, это для одного приложения. Кроме того, этому ответу почти 13 лет, и с тех пор Android, безусловно, изменился. - person CommonsWare; 22.05.2021

Для всех, кто сталкивается с этой веткой, у меня была эта проблема, и я рвал на себе волосы. У меня было объявление службы СНАРУЖИ закрывающего тега '‹ application>' 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="..." />

WRONG but still compiles without errors:

<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="..." />

person Blundell    schedule 25.03.2011
comment
это звучит как работа для расширенного ворса для Android, который улавливает эти простые ошибки! Что мы могли бы получить в конечном итоге. - person Ehtesh Choudhury; 07.06.2012
comment
Я неправильно написал имя службы в xml! Это дало мне понять, где была проблема. спасибо - person Arvand; 13.07.2013
comment
Спасибо, что опубликовали свой ответ. Это, наконец, решило, что служба не запускается. - person pmont; 01.08.2013
comment
ВАУ! Большое спасибо. Почему не работает в теге ‹application›? - person Ruchir Baronia; 02.11.2015
comment
IDE не жалуется на неправильное написание тега ‹service›. Мы также сделали ошибку на этом. - person Yeung; 04.11.2015

1) проверьте, вложено ли объявление службы в манифесте в тег приложения

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

2) проверьте, находится ли ваш service.java в том же пакете или пакете diff, что и действие

<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>
person Jianhong    schedule 06.05.2011
comment
с точкой или без? в моем случае: нет, вместо этого я использую ‹service android:name=service /› и он работает. См. stackoverflow.com/questions/2265020 / - person DiveInto; 21.09.2011
comment
с точкой это тоже должно работать, потому что вверху вы определяете свой путь к пакету - person Jianhong; 02.11.2011
comment
Чувак, большое спасибо за твой ответ. Я боролся с чертовой проблемой, и оказалось, что мой сервис был в другом пакете. Если бы я мог обнять тебя, я бы это сделал! - person racl101; 08.03.2012
comment
2 пункт помог. Большое спасибо, братан, пытался взломать его в течение 1 полного дня :( глупо, хотя - person Archie.bpgc; 15.10.2012

Я надеюсь, что смогу помочь кому-то и этой информацией: я переместил свой класс обслуживания в другой пакет и исправил ссылки. Проект был в полном порядке, НО класс обслуживания не мог быть найден активностью.

Просматривая журнал в logcat, я заметил предупреждение о проблеме: активность не смогла найти класс обслуживания, но самое смешное, что пакет был неправильным, он содержал символ «/». Компилятор искал

com.something./service.MyService

вместо

com.something.service.MyService

Я переместил класс обслуживания из пакета и обратно, и все заработало просто отлично.

person sataniccrow    schedule 10.07.2012
comment
Сначала я подумал, что / было ошибкой, но если вы продолжите просматривать записи logcat, вы увидите это много раз, и все эти приложения работают отлично. - person Axxiss; 13.07.2012
comment
ну, я не могу отрицать ваш опыт, но мой был немного другим, и, снова и снова перемещая класс из пакета, eclipse исправлял свою собственную ошибку;) и у меня не было исключения во время выполнения. - person sataniccrow; 17.07.2012
comment
Я должен сказать, что это сработало и для меня. Странная проблема, мне потребовалось полчаса, чтобы найти наш комментарий. Спасибо! - person Alex R. R.; 14.08.2012
comment
Я думаю, что у меня такая же проблема, но я не смог ее исправить, переместив файл класса... - person seb; 19.09.2012
comment
Это была моя конкретная проблема. Очень сложно понять, но / в названии службы был подсказкой. Если ваш сервис внезапно перестает работать или не работает в новой кассе, это вполне может быть причиной (и решением). - person Hayes Haugen; 10.07.2013
comment
У меня была такая же проблема, очистка проекта исправила ее. Не уверен, что это работает для всех, но это было для меня. Мне не нужно было вынимать файл из упаковки. - person Armando; 13.01.2014

В моем случае максимальное ограничение 1 МБ для передачи данных Intent. Я просто буду использовать Кэш или Хранилище.

person ranbuch    schedule 15.12.2016

Я нашел ту же проблему. Я потерял почти день, пытаясь запустить службу методом OnClickListener - вне onCreate, и через 1 день у меня все еще не получилось!!!! Очень расстраивает! Я смотрел пример примера RemoteServiceController. У них работает, а у меня не работает!

Единственный способ, который работал у меня, был изнутри метода onCreate. Ни один из других вариантов не сработал, и поверьте мне, я пробовал их все.

Вывод:

  • Если вы поместите свой класс обслуживания в другой пакет, чем mainActivity, я получу все виды ошибок
  • Также один "/" не смог найти путь к службе, попытался начать с Intent(package,className) и ничего, а также другой тип запуска Intent

  • Я переместил класс обслуживания в тот же пакет активности. Окончательная форма, которая работает.

  • Надеюсь, это поможет кому-то определить слушателей onClick внутри метода onCreate следующим образом:

    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
    

Также очень важно для файла манифеста убедиться, что сервис является дочерним элементом приложения:

<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>
person marisxanis    schedule 18.02.2014