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


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.