2010-07-31 6 views
2

J'ai deux projets dans Eclipse: client de service et d'interface utilisateur.Démarrage du service à partir d'autres apk - throws NoClassDefFoundError exception

En onCreate dans le client UI j'ai:

startService(new Intent(this, ExampleService.class)); 

mais ce fragment:

ExampleService.class 

throws Exception NoClassDefFoundError lors de l'exécution. J'ai installé ExampleService.apk et ExampleUiClient.apk. Le projet compile, et tout a l'air bien. Qu'est ce que je fais mal?

Est-il possible de démarrer le service à partir d'autres apk?

Répondre

3

Utilisez un récepteur de diffusion/diffusion

+0

pourriez-vous commenter s'il vous plaît sur les avantages/inconvénients de 'broadcast' vs' intent.setClassName' comme dans la réponse de @ John? Son approche a fonctionné pour moi et semble être vraiment simple –

+1

@AlexanderMalakhov: Avec la méthode de Johns, vous devez connaître le nom de la classe. Cela dépend vraiment de votre cas d'utilisation, je suppose. – Falmarri

0

Le service doit être déclaré dans le fichier AndroidManifest.xml de votre client.

+0

AndroidManifest.xml de ExampleService.apk: J'ai ajouté à AndroidManifest.xml de ExampleUiClient.apk < service android: name = "com.domain.ExampleService" android: exporté = "vrai"> mais cela n'a pas aidé. Une autre idée? J'ai déjà un problème similaire avec Facebook SDK. Il y avait facebook.apk, et j'ai été incapable de créer une instance de classe Facebook dans mon projet à cause du même problème - il lance NoClassDefFoundError. –

+0

Est-ce que l'apk utilise aussi le même paquet? Peut être essayer des noms explicites: new Intent ("com.domain.mypackage", "com.domain.mypackage.MyService"); – Chris

4

Si vous essayez d'utiliser un service à partir d'un autre paquet, vous ne pouvez pas utiliser simple invocation dans l'exemple Android parce que votre premier argument fait référence au contexte de votre actuel paquet, qui est par définition le mauvais endroit pour regarder.

Vous devez créer l'intention, puis utiliser setClassName (String, String), où les arguments sont l'autre package et le full nom du service. Par exemple:

Intent intent = new Intent(); 
intent.setClassName("com.example.Something", "com.example.Something.MyService"); 
startService(intent); 

Notez également que c'est un cas simple qui suppose une action par défaut sans argument - vous devez également vous assurer que le paquet contenant le service a android: exporté = « true » set pour le service Si vous n'avez aucune déclaration de filtre d'intention, l'appel échouera en raison d'un manque d'autorisations.

+0

un nitpick: étant donné que le 1er arg est un nom de paquet, il devrait être 'com.example.something' - c'est-à-dire en minuscules. –

Questions connexes