Come avviare il servizio Android da un’altra app Android

Sto riscontrando 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.

# 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 manchi qualcosa dall’intenzione quando 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 in quel momento):

 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 intent sul servizio, e non voglio impostarne uno, sto davvero cercando di capire cosa sto sbagliando iniziando con il suo nome componente, o cosa potrebbe rendere imansible fare così.

Dovresti essere in grado di avviare il tuo servizio in questo modo:

 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 CATEGORY se si specifica un componente specifico. Assicurati che il tuo servizio sia definito correttamente nel manifest.