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


81

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

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

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   
}

Клиент manifest.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>

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


Я пытался исправить ваш код, но в исходном коде есть проблемы, которые я не понимаю достаточно, чтобы попытаться это сделать. В основном у вас есть дополнительное пространство в <service ...>, это должно быть <service ...>, но если вы посмотрите на источник, у вас есть '/' перед двумя операторами импорта, и я не уверен, что они должны быть там. Я думаю, что пробелы после '<' будут причиной вашей проблемы.
Джеймс Блэк,

Спасибо, Джеймс за ответ. Эти места преднамеренно предоставлены только для отображения на сайте. Внутри кода внутри тегов нет пробелов. Даже "\" только для правильного отображения на сайте .. В основном я не получаю ошибок компиляции в eclipse. Только во время выполнения я получаю сообщение в LogCat
Vinay

Ответы:


48

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

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

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

Уважаемый г-н Марк, я добавил пульт, потому что мне нужен доступ к одному и тому же контенту из разных приложений. Я добавляю это после прочтения в сети, что лучше реализовать удаленную службу. Я изменил в соответствии с вашим предложением, и теперь он работает нормально. Еще раз спасибо.
Vinay

2
@Vinay: «Мне нужно получить доступ к одному и тому же контенту из разных приложений». Вам все равно не нужно android:process=":remote", поэтому удалите его, потому что все, что он сделает, это займет лишнюю оперативную память без всякой пользы. Удаленная служба - это служба, которая предлагает API через AIDL и не имеет ничего общего с android:processатрибутом. Вот пример удаленной службы: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… и соответствующий клиент этой службы: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare

72

Для всех, кто сталкивался с этой веткой, у меня была эта проблема, и я вырывал волосы. У меня была декларация службы ВНЕ закрывающего тега '<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="..." />

НЕПРАВИЛЬНО, но компилируется без ошибок:

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


7
это звучит как работа для улучшенного Android lint, который улавливает эти простые ошибки! Что мы можем получить в конце концов.
Этеш Чоудхури

1
Я неправильно написал имя службы в xml! Это дало мне понять, в чем проблема. thanx
Arvand

Спасибо, что разместили свой ответ. Это, наконец, решило, что служба не запускается.
pmont

ВОТ ЭТО ДА! Спасибо. Почему не работает в теге <application>?
Ruchir Baronia

IDE не жалуется на неправильно написанный тег <service>. Мы тоже ошиблись в этом.
Yeung

32

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>

1
с точкой или нет? в моем случае: нет, вместо этого я использую <service android: name = "service" />, и он работает. см. stackoverflow.com/questions/2265020/…
DiveInto

с точкой, это тоже должно работать, потому что вверху вы определяете путь к вашему пакету
Jianhong

3
Чувак, большое спасибо за твой ответ. Я боролся с чертовой проблемой, и оказалось, что моя услуга была в другом пакете. Если бы я мог обнять тебя, я бы!
racl101 07

1
2-й пункт помог. Спасибо большое, братан, попробовал взломать его в течение 1 полного дня :(. Хотя глупо
Archie.bpgc

5

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

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

com.something./service.MyService

вместо

com.something.service.MyService

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


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

1
ну, я не могу отрицать ваш опыт, но мой был немного другим, и, снова вставляя и удаляя класс из пакета, eclipse исправил свою собственную ошибку;) и я не получил исключения во время выполнения.
sataniccrow

2
Я должен сказать, что у меня это тоже сработало. Странная проблема, у меня ушло полчаса, чтобы найти наш комментарий. Благодаря!
Alex RR

Я думаю, что у меня та же проблема, но я не мог исправить ее, переместив файл класса ...
seb

Это была моя особая проблема. Очень сложно понять, но ключ / в названии службы был подсказкой. Если ваша служба внезапно перестает работать или не работает в новой кассе, это вполне может быть причиной (и решением).
Hayes Haugen

0

В моем случае максимальный предел 1 МБ для передачи данных по намерению. Я просто использую кеш или хранилище.


0

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

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

Заключение:

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

  • Я переместил класс обслуживания в тот же пакет действия Final form, который работает

  • Надеюсь, это поможет кому-то, определив слушателей 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>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.