首先,我们来看看服务的英文翻译:,,服务(名词),服务性的(形容词)。在android中服务是如何解释的呢,下面是谷歌的原文翻译:<代码>服务> 代码是一个应用程序组件,可以在后台执行长时间运行的操作,不提供用户界面。另一个应用程序组件可以启动一个服务,它将继续在后台运行,即使用户切换到另一个应用程序。此外,一个组件可以绑定到一个服务与它交互,甚至执行进程间通信(IPC)。
,,,,从上面的说明就可以知道服务是什么了,是做什么的,可以做什么,其主要特点有一下几个方面:
(1):服务是一个应用程序的组件。
(2):服务运行在后台的(背景),并且没有用户接口的。
(3):一个应用程序的服务可以在该应用程序退出时,仍然在后台正常运行。
(4):还有就是,一个服务也可以和一个组件(活动)绑定,并可以进行进程间通信。
通过谷歌的描述,我们基本上说明白服务。现在我们来看,服务到底是一个什么东西:
,首先,我们来看服务。服务的java里面定义:
公共抽象类服务延伸ContextWrapper实现ComponentCallbacks2 { … }
看到这里,估计你会恍然大悟,原来也是一个上下文子类。我们知道,活动一样也是一个上下文子类。
所以,其实从某种意义上来讲服务和活动本质是一样的。相对于服务来说,活动只是还封装了一些与界面显示相关的方法和数据,以及实现了用户与应用交流的一些像是按键事件处理,窗口信息等这样一类方法。因为,一个服务根本没有可供前台显示,与用户交流的能力,所以可以理解我服务是运行在后来的(在后台运行)。
所以,对服务于来说,一个活动用于处理需要能够与用户直接交流的工作。相对于活动来说,一个服务主要用于处理不需要与用户直接交流的工作,比如播放音乐(当我们推出音乐播放器的时候,音乐仍然还在播放,这里播放这个音乐就是用一个服务来做的)。
如何启动一个服务呢?语境中有启动,停止服务的方法,所以活动和服务都是可以启动和停止一个服务。我们来看看语境中有启动,停止服务的方法(其具体的方法实现,在ContextImpl。java里):
公共抽象ComponentName startService(意图服务);
公共抽象逻辑stopService(意图服务);
公共抽象逻辑bindService(目的服务,ServiceConnection康涅狄格州,int旗帜);
公共布尔bindService(目的服务,ServiceConnection康涅狄格州,int, int userHandle) { 把新RuntimeException(“没有实现。必须在一个子类重写。”); }
公共抽象空洞unbindService(康涅狄格州ServiceConnection);
由此可见,启动一个服务其实有两种:开始和绑定。有什么区别呢?
我们还是来看看谷歌如何解释stopService的:
使用startService()覆盖默认的服务生命周期是由{@link # bindService}:它要求服务继续运行直到{@link # stopService},无论任何客户端连接到它。
下面看看谷歌如何解释bindService的:
这定义您的应用程序和服务之间的依赖关系。
所需的服务将被视为系统(1):从上面的解释可以知道,用startService()来启动一个服务,该启动的服务不依赖于这个启动他的应用(活动或者服务),几乎可以说和启动这个服务的组件没有其他关联,一般情况下,除非调用stopService()来停止这个服务,否则这个服务是不会因为其他原因被迫停止的,当然这里说的也只是一般情况,往往还有一些特殊情况,如下谷歌的解释:
很显然这是一种特殊情况。只要我们知道,一般情况下系统会尽量让startService启动的服务保持运行状态的,除非stopService()方式来停止这个服务。
(2):相比startService()来启动一个服务,BindService()启动一个服务就不一样了,从上面的谷歌的意思可以知道:BindService()方式启动的服务和启动他的应用是相互依赖的,其实更多的是这个服务依赖于这个应用。实际上android系统是这样觉得的:对于启动这个服务的组件(活动/服务),如果这个组件(活动/服务)都不存在了,那么这个被他启动的服务也是没有必要保留的。
下面我们来看看服务的一个方法:公共空间>我们再来说一下服务这个函数公共空间>接下来,要说最后一个问题:看到有人在网上问,既然服务是在后台运行的,那和定义一个线程来来做这些工作有是不是是一样的呢?回答当然是否定的,而且根本是风牛马不相及,下面一点点来解释:Android之服务探究