Service Intent kann nicht gestartet werden

81

Ich habe eine Serviceklasse. Ich habe diese Klasse in jar exportiert und das jar in meine Client-App eingebettet.

Bei Bedarf rufe ich die Serviceklasse an. Wenn ich dies versuche, wird folgende Fehlermeldung angezeigt:

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

Ich habe außer der Serviceklasse eine andere Klasse, auf die ich zugreifen kann (Objekt dieser Klasse erstellen), die sich im selben Glas befindet.

Ich habe das Gefühl, dass ich etwas in meiner Konfiguration oder meinem Manifest oder so verpasst habe.

Bitte helfen Sie mir, das gleiche zu identifizieren. Mein Code ist unten:

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>

Vielen Dank im Voraus,
Vinay

Vinay
quelle
Ich habe versucht, Ihren Code zu reparieren, aber in der Quelle gibt es Probleme, die ich nicht genug verstehe, um es zu versuchen. Grundsätzlich haben Sie einen zusätzlichen Platz in <service ...>, es sollte <service ...> sein, aber wenn Sie sich die Quelle ansehen, haben Sie ein '/' vor den beiden import-Anweisungen und ich bin nicht sicher, ob sie sollen da sein. Ich denke, die Leerzeichen nach dem '<' werden die Ursache für Ihr Problem sein.
James Black
Danke James für die Antwort. Diese Leerzeichen werden absichtlich nur zur Anzeige auf der Site vergeben. Innerhalb des Codes gibt es keine Leerzeichen innerhalb der Tags. Sogar das "\" dient nur zur korrekten Anzeige auf der Site. Grundsätzlich erhalte ich bei Eclipse keine Kompilierungsfehler. Nur zur Laufzeit erhalte ich die Nachricht in LogCat
Vinay

Antworten:

48

Erstens brauchen Sie es nicht android:process=":remote", also entfernen Sie es bitte, da es nur zusätzlichen Arbeitsspeicher ohne Nutzen beansprucht.

Zweitens, da das <service>Element eine Aktionszeichenfolge enthält, verwenden Sie diese:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}
CommonsWare
quelle
Sehr geehrter Herr Mark, ich habe die Fernbedienung hinzugefügt, da ich über die verschiedenen Apps auf denselben Inhalt zugreifen muss. Nachdem ich im Web gelesen habe, füge ich hinzu, dass es besser ist, einen Remote-Dienst zu implementieren. Ich habe gemäß Ihrem Vorschlag geändert und es funktioniert jetzt einwandfrei. Noch einmal vielen Dank.
Vinay
2
@Vinay: "Ich muss über die verschiedenen Apps auf denselben Inhalt zugreifen." Sie benötigen ihn immer noch nicht. android:process=":remote"Entfernen Sie ihn daher, da er nur zusätzlichen Arbeitsspeicher ohne Nutzen beansprucht. Ein Remotedienst bietet eine API über AIDL an und hat nichts mit dem android:processAttribut zu tun . Hier ist ein Beispiel für einen Remote-Dienst: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/… und hier ist ein entsprechender Kunde dieses Dienstes: github.com/commonsguy/cw-advandroid/tree/master/AdvServices/ …
CommonsWare
72

Für alle anderen, die auf diesen Thread stießen, hatte ich dieses Problem und zog mir die Haare aus. Ich hatte die Service-Deklaration AUSSERHALB des End-Tags '<Anwendung>' DUH!

RICHTIG:

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

FALSCH aber immer noch fehlerfrei kompiliert:

<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
quelle
7
Das klingt nach einem Job für einen verbesserten Android-Flusen, der diese einfachen Fehler aufgreift! Was wir vielleicht irgendwann bekommen.
Ehtesh Choudhury
1
Ich hatte den Dienstnamen in XML falsch geschrieben! Dies gab mir einen Hinweis, wo das Problem lag. Danke
Arvand
Vielen Dank für Ihre Antwort. Dadurch wurde der nicht startende Dienst endgültig behoben.
pmont
BEEINDRUCKEND! Vielen Dank. Warum funktioniert es im <application> -Tag nicht?
Ruchir Baronia
Die IDE beschwert sich nicht über falsch geschriebene <service> -Tags. Wir haben auch Fehler gemacht.
Yeung
32

1) Überprüfen Sie, ob die Dienstdeklaration im Manifest im Anwendungs-Tag verschachtelt ist

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

2) Überprüfen Sie, ob Sie service.javasich im selben Paket oder Diff-Paket wie die Aktivität befinden

<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
quelle
1
mit dem Punkt oder nicht? in meinem Fall: nicht, stattdessen benutze ich <service android: name = "service" /> und es funktioniert. Siehe stackoverflow.com/questions/2265020/…
DiveInto
mit dem Punkt sollte es auch funktionieren, weil Sie oben Ihren
Paketpfad
3
Alter, vielen Dank für deine Antwort. Ich habe mit einem verdammten Problem gerungen und es stellte sich heraus, dass mein Service in einem anderen Paket war. Wenn ich dich umarmen könnte, würde ich!
racl101
1
2. Punkt hat geholfen. Vielen Dank, Bruder, habe versucht, es für 1 ganzen Tag zu knacken :(.
Dumm
5

Ich hoffe, ich kann auch jemandem mit diesen Informationen helfen: Ich habe meine Serviceklasse in ein anderes Paket verschoben und die Referenzen korrigiert. Das Projekt war vollkommen in Ordnung, ABER die Serviceklasse konnte von der Aktivität nicht gefunden werden.

Beim Betrachten der Anmeldung in logcat bemerkte ich die Warnung zu dem Problem: Die Aktivität konnte die Serviceklasse nicht finden, aber das Komische war, dass das Paket falsch war und ein "/" Zeichen enthielt. Der Compiler suchte

com.something./service.MyService

anstatt

com.something.service.MyService

Ich habe die Serviceklasse aus dem Paket heraus und wieder hineingezogen und alles hat gut funktioniert.

Sataniccrow
quelle
Zuerst dachte ich, dass / ein Fehler war, aber wenn Sie sich weiterhin Logcat-Einträge ansehen, werden Sie es oft sehen und all diese Apps funktionieren perfekt.
Axxiss
1
Nun, ich kann deine Erfahrung nicht leugnen, aber meine war etwas anders und durch das Ein- und Ausziehen der Klasse aus dem Paket hat Eclipse seinen eigenen Fehler behoben;) und ich habe keine Laufzeitausnahme erhalten.
Sataniccrow
2
Ich muss sagen, dass es auch bei mir funktioniert hat. Seltsames Problem, ich habe eine halbe Stunde gebraucht, um unseren Kommentar zu finden. Vielen Dank!
Alex RR
Ich glaube, ich habe das gleiche Problem, aber ich konnte es nicht durch Verschieben der Klassendatei
beheben
Das war mein besonderes Problem. Sehr schwer herauszufinden, aber das / im Servicenamen war ein Hinweis. Wenn Ihr Service plötzlich nicht mehr funktioniert oder an einer neuen Kasse nicht mehr funktioniert, kann dies die Ursache (und Lösung) sein.
Hayes Haugen
0

In meinem Fall die maximale Obergrenze von 1 MB für den Datentransport durch Intent. Ich werde nur Cache oder Speicher verwenden.

Ranbuch
quelle
0

Ich habe das gleiche Problem gefunden. Ich habe fast einen Tag verloren, als ich versucht habe, einen Dienst von der OnClickListenerMethode aus zu starten - außerhalb der onCreateund nach einem Tag bin ich immer noch gescheitert !!!! Sehr frustrierend! Ich habe mir das Beispielbeispiel angesehen RemoteServiceController. Ihre funktioniert, aber meine Implementierung funktioniert nicht!

Der einzige Weg, der für mich funktionierte, war von innen heraus onCreate. Keine der anderen Varianten hat funktioniert und glauben Sie mir, ich habe sie alle ausprobiert.

Fazit:

  • Wenn Sie Ihre Serviceklasse in ein anderes Paket als die mainActivity einfügen, werden alle Arten von Fehlern angezeigt
  • Auch das eine "/" konnte keinen Pfad zum Dienst finden, versuchte mit Intent(package,className)und nichts zu beginnen, auch eine andere Art von Absichtsstart

  • Ich habe die Serviceklasse in dasselbe Paket der Aktivität Final Form verschoben, das funktioniert

  • Hoffentlich hilft dies jemandem, indem die Listener onClickinnerhalb der onCreateMethode wie folgt definiert werden :

    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

Stellen Sie auch für die Manifest-Datei sehr wichtig, dass der Dienst der Anwendung untergeordnet ist:

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