Mam klasę usług. Wyeksportowałem tę klasę do jar i umieściłem jar w mojej aplikacji klienckiej.
W razie potrzeby dzwonię do klasy obsługi. Kiedy próbuję to zrobić, pojawia się następujący błąd:
Unable to start service Intent {comp={com.sample.service/com.sample.service.serviceClass}} : not found
Mam inną klasę oprócz klasy usługi, do której mam dostęp (tworzenie obiektu tej klasy), które znajdują się w tym samym słoiku.
Czuję, że przegapiłem coś w mojej konfiguracji lub manifestacji.
Proszę, pomóż mi zidentyfikować to samo. Mój kod jest poniżej:
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
}
Klient 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>
Z góry dziękuję,
Vinay
Odpowiedzi:
Po pierwsze, nie potrzebujesz
android:process=":remote"
, więc usuń go, ponieważ wszystko, co zrobi, to zajmie dodatkową pamięć RAM bez żadnych korzyści.Po drugie, ponieważ
<service>
element zawiera ciąg akcji, użyj go:public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent=new Intent("com.sample.service.serviceClass"); this.startService(intent); }
źródło
android:process=":remote"
, więc usuń ją, ponieważ wystarczy, że zajmie dodatkową pamięć RAM bez żadnych korzyści. Usługa zdalna to taka, która oferuje API za pośrednictwem AIDL i nie ma nic wspólnego zandroid:process
atrybutem. Oto przykładowa usługa zdalna: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ ... a tutaj odpowiadający klient tej usługi: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …Dla każdego, kto natknął się na ten wątek, miałem ten problem i wyrywałem sobie włosy. Miałem deklarację usługi POZA tagiem końcowym „<application>” DUH!
DOBRZE:
<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="..." />
ŹLE, ale nadal kompiluje się bez błędów:
<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="..." />
źródło
1) sprawdź, czy deklaracja usługi w manifeście jest zagnieżdżona w tagu aplikacji
<application> <service android:name="" /> </application>
2) sprawdź, czy Twój
service.java
pakiet znajduje się w tym samym pakiecie lub pakiecie różnicowym, co ćwiczenie<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>
źródło
Mam nadzieję, że mogę komuś pomóc z tymi informacjami: przeniosłem moją klasę usług do innego pakietu i poprawiłem odniesienia. Projekt był w porządku, ALE nie można było znaleźć klasy usług w działaniu.
Oglądając logcat logcat zauważyłem ostrzeżenie o problemie: aktywność nie mogła znaleźć klasy usługi, ale zabawne było to, że pakiet był niepoprawny, zawierał znak "/". Kompilator szukał
zamiast
Przeniosłem klasę serwisową z pakietu i z powrotem i wszystko działało dobrze.
źródło
W moim przypadku maksymalny limit 1 MB dla transportu danych przez intencję. Po prostu użyję pamięci podręcznej lub pamięci.
źródło
Znalazłem ten sam problem. Straciłem prawie dzień próbując rozpocząć serwis od
OnClickListener
metody - pozaonCreate
i po 1 dniu nadal mi się nie udało !!!! Bardzo frustrujące! Patrzyłem na przykładowy przykładRemoteServiceController
. Ich działa, ale moja realizacja nie działa!Jedynym sposobem, który działał dla mnie, była
onCreate
metoda od wewnątrz . Żaden z pozostałych wariantów nie działał i wierz mi, że wypróbowałem je wszystkie.Wniosek:
Również ten "/" nie mógł znaleźć ścieżki do usługi, próbował zacząć od
Intent(package,className)
i nic, także inny typ intencjiPrzeniosłem klasę usługi w tym samym pakiecie działania Forma końcowa, która działa
Mam nadzieję, że pomoże to komuś, definiując listernery
onClick
wewnątrzonCreate
metody w następujący sposób: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
Również bardzo ważne dla pliku Manifest, upewnij się, że usługa jest elementem podrzędnym aplikacji:
<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>
źródło