2013-06-26 20 views
14

Ho riscontrato un problema nell'avvio di un servizio da un'altra app Android (API 17). Tuttavia, se eseguo "am" dalla shell, il servizio si avvia correttamente.Come avviare il servizio Android da un'altra app Android

# 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 

Quindi, non sembra che mi manca qualcosa dal intento quando lo faccio lo stesso nel codice:

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); } 

Quello che ottengo è (il servizio non è in esecuzione a quel tempo):

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

non ho un filtro intento a servizio, e io non voglio crearne uno, sto cercando di capire che cosa sto facendo di sbagliato iniziarlo attraverso la sua nome del componente o cosa potrebbe renderlo impossibile le fare così.

+0

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

+0

@Richa Questa pagina ha esempi con l'utilizzo di Intent.setClassName(), ma in realtà non rispondi alla mia domanda specifica ... –

+0

pubblica il tuo manifest –

risposta

35

Si dovrebbe essere in grado di avviare il servizio come questo:

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

Non è necessario impostare ACTION o CATEGORIA, se si specifica un componente specifico. Assicurati che il tuo servizio sia definito correttamente nel manifest.

+0

La cosa divertente è che se uso i.setClassName (.. .) (e imposta il nome/categoria), funziona. I dati di intenti stampati nel log sono esattamente gli stessi. Sono solo confuso sul motivo per cui i dati di intenti stampati da am sembrano essere uguali ai miei quando uso setComponent(), tuttavia uno avvia il servizio, e l'altro no ... –

+0

Tutto sembra davvero strano . Per favore pubblica il tuo manifest. –

+0

http://pastebin.com/9KreiFmg –

Problemi correlati