Android的服务多个实例(Android Service multiple instances)

2019-08-21 10:28发布

林还是有点新的Android的服务类。 我知道你需要从startService(意图)申请启动该服务,但我的问题是我的服务里面的方法。 我需要有一个意图启动该服务,然后在我的活动创建一个类的对象,所以我可以调用该服务的方法。 问题是,当我这样做我创建该服务的一个实例,当我有意向和服务的另一实例启动它,当我在我的活动创建该类的对象。 这意味着传递到服务,从startService(意向)的任何数据是不存在的,当我创建的服务对象。 解决这个任何方式还是我只是完全滥用服务类? 我可以提供一些代码,但它基本上是这样的:

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

Answer 1:

我说你是滥用类:-)。

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

从文档 :

请求给定的应用服务启动。 这样做的目的可以包含特定服务实现的完整的类名来启动,或通过动作和各种服务和其他领域的抽象定义开始。 如果此服务尚未运行,它将会被实例化,并开始(如果需要为它创造的过程); 如果正在运行,那么它仍然保持运行。

你应该重写onStartCommand()为好。 如果它尚未启动的第一个电话startService启动服务。 在任何情况下onStartCommand将拦截要发送给它的任何进一步startService电话和意图。



Answer 2:

解决这个任何方式还是我只是完全滥用服务类?

你是完全滥用Service类。

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

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

  2. 结合到它,调用由该展示的API Service ,经由bindService()

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

因此,我首先建议你坐下来, 完全准确地确定为什么您使用的Service摆在首位。 ControlPanel ,例如,是我将与UI,UI不能少(“背景”)业务相关联的名称。 那时,也只有这样你才能决定是否命令或结合模式是适合您的使用情况。



Answer 3:

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

public static int myStaticMethod(){
        return 1;
    }

只是让你需要访问的静态方法。



文章来源: Android Service multiple instances