2013-06-26 204 views
14

我從另一個Android應用程序(API 17)啓動服務時遇到問題。 但是,如果我確實從shell運行'am',則服務啓動正常。如何從另一個Android應用程序啓動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 

所以,它看起來並不像我從意向缺少什麼,當我做同樣的代碼:

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

我得到的是(服務未在運行那段時間):

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

我沒有對服務的意圖過濾器,我不希望設置一個,我真的想了解我在做什麼錯,通過啓動它的組件名稱,或者可能使其變得不可能樂來這樣做。

+0

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

+0

@Richa這個頁面有使用Intent.setClassName()的例子,但它並不真的回答我的具體問題... –

+0

發佈您的清單 –

回答

35

您應該能夠啓動你的服務是這樣的:

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

你並不需要設置操作或類別,如果你指定一個特定組成部分。確保您的服務在清單中正確定義。

+0

有趣的是,如果我使用i.setClassName(.. 。)(並設置名稱/類別),它的工作原理。打印到日誌中的意圖數據完全相同。我只是感到困惑,爲什麼我使用setComponent()打印的意圖數據似乎與我的相同,但是一個啓動服務,另一個不啓動服務,另一個不... –

+0

這一切聽起來很奇怪。請張貼您的清單。 –

+0

http://pastebin.com/9KreiFmg –

相關問題