web-dev-qa-db-fra.com

Impossible de démarrer l'intention du service

J'ai une classe de service. J'ai exporté cette classe dans un bocal et j'ai intégré le bocal dans mon application client.

Au besoin, j'appelle la classe de service. Lorsque j'essaie de faire cela, j'obtiens l'erreur suivante:

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

J'ai une autre classe en dehors de la classe de service, à laquelle je peux accéder (créer un objet de cette classe) qui se trouvent dans le même fichier jar.

J'ai l'impression d'avoir oublié quelque chose dans ma configuration ou mon manifeste.

S'il vous plaît aidez-moi à identifier le même. Mon code est ci-dessous:

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>

Merci d'avance,
Vinay

80
Vinay

Tout d’abord, vous n’avez pas besoin de Android:process=":remote", Supprimez-le donc, car il ne vous reste plus qu’à absorber des sommes supplémentaires RAM sans aucun bénéfice.

Deuxièmement, puisque l'élément <service> Contient une chaîne d'action, utilisez-la:

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

Pour tous ceux qui venaient à travers ce fil, j'avais ce problème et me tirais les cheveux. J'ai eu la déclaration de service à l'extérieur de la balise de fin '<application>' DUH!

DROITE:

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

FAUX mais compile toujours sans erreur:

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

1) vérifier si la déclaration de service dans le manifeste est imbriquée dans la balise d'application

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

2) vérifiez si votre service.Java est dans le même package ou le même package diff que l'activité

<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>
32
Jianhong

J'espère pouvoir également aider quelqu'un avec ces informations: j'ai déplacé ma classe de services dans un autre package et j'ai corrigé les références. Le projet fonctionnait parfaitement bien, MAIS la classe de services n’était pas trouvée par l’activité.

En regardant la connexion dans logcat, j'ai remarqué l'avertissement concernant le problème: l'activité ne pouvait pas trouver la classe de service, mais ce qui était amusant, c'est que le package était incorrect, il contenait un caractère "/". Le compilateur cherchait

com.something./service.MyService

au lieu de

com.something.service.MyService

J'ai transféré la classe de service hors du paquet, puis tout a bien fonctionné.

5
sataniccrow

Dans mon cas, le plafond maximum de 1 Mo pour le transport de données par intention. Je vais juste utiliser le cache ou le stockage.

0
ranbuch

J'ai trouvé le même problème. J'ai perdu presque une journée à essayer de démarrer un service à partir de la méthode OnClickListener - en dehors de la onCreate et après un jour, j'ai toujours échoué !!!! Très frustrant! Je regardais l'exemple de l'exemple RemoteServiceController. Leur fonctionne, mais ma mise en œuvre ne fonctionne pas!

La seule façon qui fonctionnait pour moi était de l'intérieur de la méthode onCreate. Aucune des autres variantes ne fonctionnait et croyez-moi, je les ai toutes essayées.

Conclusion:

  • Si vous placez votre classe de service dans un package différent de celui de mainActivity, j'obtiendrai toutes sortes d'erreurs.
  • De plus, le "/" n'a pas pu trouver le chemin d'accès au service, a essayé en commençant par Intent(package,className) et rien, ainsi qu'un autre type d'intention commençant par

  • J'ai déplacé la classe de service dans le même package de l'activité Forme finale qui fonctionne

  • Espérons que cela aide quelqu'un en définissant les listerners onClick dans la méthode onCreate comme ceci:

    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
    

Également très important pour le fichier Manifest, assurez-vous que le service est un enfant d'application:

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