2013-06-26 167 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 –

相关问题