4

我对 Android 服务类还是有点陌生​​。我知道您需要使用 startService(intent) 从您的应用程序启动服务,但是我的问题是我的服务内部有方法。我需要以意图启动服务,然后在我的 Activity 中创建该类的对象,以便我可以调用服务的方法。问题是,当我这样做时,我会在以意图启动服务时创建一个服务实例,而当我在我的活动中创建类的对象时会创建另一个服务实例。这意味着当我创建服务对象时,从 startService(intent) 传递给服务的任何数据都不存在。有什么方法可以解决这个问题,还是我只是完全滥用了服务类?我可以给出一些代码,但基本上是这样的:

//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);
4

3 回答 3

18

我会说你在滥用课程:-)。

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

文档

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

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

于 2013-04-10T16:36:50.030 回答
9

有什么方法可以解决这个问题,还是我只是完全滥用了服务类?

您完全在滥用Service课程。

AService通过两种基本模式使用:

  1. 通过 向它发送命令startService()

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

绑定更准确地描述了您正在尝试做的事情(“所以我可以调用服务的方法”),但是绑定很难正确处理,尤其是在配置更改时。

因此,我建议您先坐下来,完全准确地确定您首先使用 a的原因ServiceControlPanel,例如,是我将与 UI 相关联的名称,而不是无 UI(“背景”)操作。只有这样,您才能确定命令或绑定模式是否适合您的用例。

于 2013-04-10T16:38:09.083 回答
-8

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

public static int myStaticMethod(){
        return 1;
    }

只需将访问所需的方法设为静态即可。

于 2015-09-27T00:23:30.173 回答