У меня есть класс обслуживания. Я экспортировал этот класс в 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>
Заранее спасибо,
Винай
Ответы:
Во-первых, он вам не нужен
android:process=":remote"
, поэтому удалите его, так как все, что он сделает, это займет лишнюю оперативную память без всякой пользы.Во-вторых, поскольку
<service>
элемент содержит строку действия, используйте ее:public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent=new Intent("com.sample.service.serviceClass"); this.startService(intent); }
источник
android:process=":remote"
, поэтому удалите его, потому что все, что он сделает, это займет лишнюю оперативную память без всякой пользы. Удаленная служба - это служба, которая предлагает API через AIDL и не имеет ничего общего сandroid:process
атрибутом. Вот пример удаленной службы: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… и соответствующий клиент этой службы: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …Для всех, кто сталкивался с этой веткой, у меня была эта проблема, и я вырывал волосы. У меня была декларация службы ВНЕ закрывающего тега '<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="..." />
источник
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>
источник
Я надеюсь, что смогу помочь кому-нибудь и с этой информацией: я переместил свой класс обслуживания в другой пакет и исправил ссылки. Проект был прекрасен, НО класс обслуживания не мог быть найден по активности.
Просматривая журнал в logcat, я заметил предупреждение о проблеме: активность не может найти класс обслуживания, но самое забавное, что пакет был неправильным, он содержал символ "/". Компилятор искал
вместо
Я переместил класс обслуживания из пакета и обратно, и все работало нормально.
источник
В моем случае максимальный предел 1 МБ для передачи данных по намерению. Я просто использую кеш или хранилище.
источник
Я нашел ту же проблему. Я потерял почти день, пытаясь запустить службу из
OnClickListener
метода - внеonCreate
и через 1 день мне все равно не удалось !!!! Очень неприятно! Я смотрел на образец примераRemoteServiceController
. Они работают, но моя реализация не работает!Единственный способ, который работал у меня, был
onCreate
метод изнутри . Ни один из других вариантов не работал, и поверьте мне, я перепробовал их все.Заключение:
Также один "/" не смог найти путь к службе, попытался начать с
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>
источник