2010-08-09 5 views
78

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

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

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 
} 

Client 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> 

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

+0

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

+0

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

ответ

48

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

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

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

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

+2

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

+0

Спасибо для ввода г-н Марк. Я обязательно сделаю это ... – Vinay

70

Для любого другого наступающем по этой теме я имел этот вопрос и был потянув меня за волосы. У меня была служебная декларация OUTSIDE от «< application>» end tag 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

это звучит как работа для расширенного андроида, который подбирает эти простые ошибки! Которые мы могли бы получить в конце концов. –

+1

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

+0

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

31

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

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

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

<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

с точкой или нет? в моем случае: нет, вместо этого я использую , и он работает.see http://stackoverflow.com/questions/2265020/why-doesnt-my-service-work-in-android -i-just-want-to-log-something-ever-5-seco – DiveInto

+0

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

+3

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

4

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

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

com.something./service.MyService

вместо

com.something.service.MyService

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

+0

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

+1

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

+2

Должен сказать, что это сработало и для меня. Странный вопрос, мне понадобилось полчаса, чтобы найти наш комментарий. Благодаря! –

0

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

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

Вывод:

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

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

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

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

Смежные вопросы