2013-06-26 11 views
14

Ich habe ein Problem beim Starten eines Dienstes von einer anderen Android-App (API 17). Wenn ich jedoch "bin" aus der Shell ausführen, startet der Dienst gut.Wie starte ich Android-Dienst von einer anderen Android-App

# am startservice com.xxx.yyy/.SyncService 
Starting service: Intent { act=android.intent.action.MAIN cat= 
[android.intent.category.LAUNCHER] cmp=com.xxx.yyy/.SyncService } 
(service starts fine at this point) 
# am to-intent-uri com.xxx.yyy/.SyncService 
intent:#Intent;action=android.intent.action.MAIN; 
category=android.intent.category.LAUNCHER; 
component=com.xxx.yyy/.SyncService;end 

Also, es sieht nicht aus wie ich nichts von der Absicht fehlt bin, wenn ich das gleiche im Code tun:

Intent i = new Intent(); 
i.setAction(Intent.ACTION_MAIN); 
i.addCategory(Intent.CATEGORY_LAUNCHER); 
i.setComponent(new ComponentName("com.xxx.yyy", ".SyncService")); 
ComponentName c = ctx.startService(i); 
if (c == null) { Log.e(TAG, "failed to start with "+i); } 

Was ich (der Dienst nicht ausgeführt wird dass Zeit):

E/tag(4026): failed to start with Intent { 
act=android.intent.action.MAIN 
cat=[android.intent.category.LAUNCHER] 
cmp=com.xxx.yyy/.SyncService } 

ich eine Intent-Filter nicht auf den Dienst haben, und ich will nicht, eine erstellen, ich versuche wirklich zu verstehen, was mache ich falsch es durch das Starten von seiner Komponentenname oder was es unmöglich machen könnte le zu tun.

+0

siehe http://saigeethamn.blogspot.in/2009/09/android-developer-tutorial-part-9.html – Richa

+0

@Richa Diese Seite hat Beispiele mit Intent.setClassName(), aber es ist nicht wirklich Beantworte meine spezifische Frage ... –

+0

poste dein Manifest –

Antwort

35

sollten Sie in der Lage sein, Ihren Dienst wie folgt zu starten:

Intent i = new Intent(); 
i.setComponent(new ComponentName("com.xxx.yyy", "com.xxx.yyy.SyncService")); 
ComponentName c = ctx.startService(i); 

Sie brauchen nicht ACTION oder KATEGORIE einstellen, wenn Sie eine bestimmte Komponente angeben. Stellen Sie sicher, dass Ihr Dienst im Manifest ordnungsgemäß definiert ist.

+0

Lustige Sache ist, wenn ich i.setClassName (.. .) (und den Namen/die Kategorie einstellen), es funktioniert. Die Absichtsdaten, die im Protokoll ausgedruckt werden, sind identisch. Ich bin nur verwirrt, warum die von mir ausgedruckten Absichtsdaten die gleichen sind wie meine, wenn ich setComponent() benutze, aber der eine startet den Dienst, und der andere nicht ... –

+0

Das klingt alles sehr seltsam . Bitte poste dein Manifest. –

+0

http://pastebin.com/9KreiFmg –