Невозможно запустить сервисное намерение - PullRequest
80 голосов
/ 09 августа 2010

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

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

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

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

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

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

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>

Заранее спасибо,
Vinay

Ответы [ 6 ]

72 голосов
/ 26 марта 2011

Для всех, кто сталкивался с этой темой, у меня была эта проблема, и я вырывал свои волосы. У меня было служебное объявление ЗА ВНЕШНИМ тегом 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="..." />

48 голосов
/ 09 августа 2010

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

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

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}
32 голосов
/ 06 мая 2011

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>
5 голосов
/ 10 июля 2012

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

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

com.something. / Service.MyService

вместо

com.something.service.MyService

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

0 голосов
/ 15 декабря 2016

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

0 голосов
/ 19 февраля 2014

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

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

Вывод:

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

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

  • Надеюсь, это кому-нибудь поможет, определив листеры 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>
...