Nie można uruchomić zamiaru usługi

81

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

Vinay
źródło
Próbowałem naprawić twój kod, ale w kodzie źródłowym są problemy, których nie rozumiem wystarczająco, aby spróbować. Zasadniczo masz dodatkową spację w <service ...>, powinno to być <service ...>, ale jeśli spojrzysz na źródło, masz `` / '' przed dwoma instrukcjami importu i nie jestem pewien, czy one mają tam być. Myślę, że spacje po „<” będą przyczyną Twojego problemu.
James Black
Dzięki James za odpowiedź. Te przestrzenie są podane celowo tylko w celu wyświetlenia w witrynie. Wewnątrz kodu nie ma spacji wewnątrz tagów. Nawet "\" służy tylko do poprawnego wyświetlania na stronie .. W zasadzie nie dostaję żadnych błędów kompilacji w eclipse. Tylko w czasie wykonywania otrzymuję wiadomość w LogCat
Vinay,

Odpowiedzi:

48

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);
}
CommonsWare
źródło
Szanowny Panie Mark, Dodałem pilota, ponieważ potrzebuję dostępu do tych samych treści z różnych aplikacji. Uwzględniam to po przeczytaniu w sieci, że lepiej jest wdrożyć usługę zdalną. Zmodyfikowałem zgodnie z twoją sugestią i teraz działa dobrze. Jeszcze raz dziękuję.
Vinay,
2
@Vinay: „Muszę mieć dostęp do tej samej zawartości z różnych aplikacji.” Nadal nie potrzebujesz 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 z android:processatrybutem. 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/ …
CommonsWare
72

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="..." />

Blundell
źródło
7
brzmi to jak zadanie dla ulepszonego szarpaka Androida, który wychwytuje te proste błędy! Które w końcu możemy dostać.
Ehtesh Choudhury
1
Błędnie wpisałem nazwę usługi w xml! To dało mi wskazówkę, gdzie był problem. thanx
Arvand
Dziękujemy za przesłanie odpowiedzi. To ostatecznie rozwiązało problem z uruchamianiem usługi.
pmont
ŁAŁ! Dzięki wielkie. Dlaczego nie działa w tagu <application>?
Ruchir Baronia
IDE nie narzeka na błędnie napisany tag <service>. My też popełniliśmy błąd.
Yeung
32

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.javapakiet 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>
Jianhong
źródło
1
z kropką czy nie? w moim przypadku: nie, zamiast tego używam <service android: name = "service" /> i działa. zobacz stackoverflow.com/questions/2265020/ ...
DiveInto
z kropką to też powinno działać, ponieważ u góry definiujesz ścieżkę pakietu
Jianhong
3
Koleś, bardzo dziękuję za odpowiedź. Zmagałem się z cholernym problemem i okazało się, że moja usługa była w innym pakiecie. Gdybym mógł cię przytulić, zrobiłbym to!
racl101
1
Drugi punkt pomógł.
Wielkie
5

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ł

com.something./service.MyService

zamiast

com.something.service.MyService

Przeniosłem klasę serwisową z pakietu i z powrotem i wszystko działało dobrze.

sataniccrow
źródło
Najpierw pomyślałem, że / to błąd, ale jeśli będziesz patrzeć na wpisy logcat, zobaczysz to wiele razy i wszystkie te aplikacje działają idealnie.
Axxiss,
1
cóż, nie mogę zaprzeczyć twojemu doświadczeniu, ale moje było trochę inne i przenosząc i wyprowadzając ponownie klasę z pakietu, eclipse naprawiło swój własny błąd;) i nie dostałem żadnego wyjątku wykonawczego.
sataniccrow
2
Muszę powiedzieć, że mi też się udało. Dziwny problem, zajęło mi pół godziny, aby znaleźć nasz komentarz. Dzięki!
Alex RR
Myślę, że mam ten sam problem, ale nie mogłem go naprawić, przenosząc plik klasy ...
seb
To był mój szczególny problem. Bardzo trudno to rozgryźć, ale znak / w nazwie usługi był wskazówką. Jeśli Twoja usługa nagle przestaje działać lub nie działa w nowej kasie, może to być bardzo dobrze przyczyną (i rozwiązaniem).
Hayes Haugen
0

W moim przypadku maksymalny limit 1 MB dla transportu danych przez intencję. Po prostu użyję pamięci podręcznej lub pamięci.

ranbuch
źródło
0

Znalazłem ten sam problem. Straciłem prawie dzień próbując rozpocząć serwis od OnClickListenermetody - poza onCreatei po 1 dniu nadal mi się nie udało !!!! Bardzo frustrujące! Patrzyłem na przykładowy przykład RemoteServiceController. Ich działa, ale moja realizacja nie działa!

Jedynym sposobem, który działał dla mnie, była onCreatemetoda od wewnątrz . Żaden z pozostałych wariantów nie działał i wierz mi, że wypróbowałem je wszystkie.

Wniosek:

  • Jeśli umieścisz klasę usługi w innym pakiecie niż mainActivity, pojawią się wszelkiego rodzaju błędy
  • 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 intencji

  • Przeniosł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 onClickwewnątrz onCreatemetody 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>
marisxanis
źródło