2013-04-10 154 views
1

我对Android服务类仍然有点新鲜。我知道你需要用startService(intent)从你的应用程序启动服务,但是我的问题是我的服务里面有方法。我需要以意图启动服务,然后在我的Activity中创建该类的对象,以便可以调用该服务的方法。问题是,当我这样做时,我创建了一个服务实例,当我在一个intent和另一个服务实例中启动服务时,在我的活动中创建了一个类的对象。这意味着当我创建服务的对象时,从startService(intent)传递给服务的任何数据都不存在。任何解决这个问题的方法还是我完全滥用服务类?我可以给一些代码,但其基本上是这样的:Android服务多个实例

//Create Object of ControlPanel service class. 
ControlPanel cPanel = new ControlPanel(); 
//Create intent for starting ControlPanel service class 
Intent controlPanel = new Intent(this, cPanel.getClass()); 
//Start Service 
startService(controlPanel); 

回答

7

我会说你滥用类:-)。

多次调用startService()不会导致启动多个服务。

doc

请求一个给定的应用服务启动。 Intent可以包含要启动的特定服务实现的完整类名,也可以包含通过动作和其他类型服务的其他字段的抽象定义来启动。如果此服务尚未运行,它将被实例化并启动(如果需要,将为其创建一个进程);如果它正在运行,那么它仍然在运行。

你也应该覆盖onStartCommand()。如果尚未启动,则第一个startService调用会启动该服务。在任何情况下,onStartCommand将拦截任何进一步的startService调用和您想要发送给它的意图。

3

任何解决方法或我是完全滥用服务类?

您完全滥用Service类。

Service经由两个基本模式使用:

  1. 发送给它的命令,经由startService()

  2. 绑定到它,通过bindService()调用由Service公开的API。

更准确地绑定描绘你正在尝试做的(“这样我就可以调用该服务的方法”),但结合是棘手的获得的权利,特别是当它涉及到配置更改。

因此,我首先建议你坐下来,并确定完全准确地为什么你首先使用Service。例如,ControlPanel是我将与UI关联的名称,而不是无UI(“背景”)操作。然后才能确定命令或绑定模式是否适合您的用例。

+0

我会看看bindService()。我之前简要地阅读了它,但从来没有用过它。我不明白我能找到什么。你可以推荐任何好的教程页面? – 2013-04-10 16:56:06

+0

@TravisElliott:“你可以推荐任何好的教程页面?” - 我确信有一些,但我不知道我的头顶有什么。我最简单的示例是https://github.com/commonsguy/cw-omnibus/tree/master/AdvServices/Binding,但它来自我的书的高级篇章,因此假设了其他内容(如片段)的使用经验。 – CommonsWare 2013-04-10 17:01:03

+0

这样做的关键是我需要服务在我调用它的方法时执行工作,然后通过信使发送信息到主要活动。该服务有一个可运行的线程,在后台线程上执行工作(通过tcp套接字发送数据)。任何想法在更好的方式来做到这一点。我真的不想使用Intent服务,因为另一个线程也需要保持运行以接收数据。 – 2013-04-10 17:21:07

-5

你可以用一个服务类来做到这一点。

public static int myStaticMethod(){ 
     return 1; 
    } 

只需制作访问静态所需的方法即可。

+0

我不确定这是否回答了问题。 – 2015-09-27 00:54:57

+1

肯定没有。 – JHH 2016-10-13 09:15:28