首页 > 代码库 > Service

Service

  作为四大控件之一,service的重要性可想而知,稍大些的项目或多或少都要用到,但是有时候想到service,一时半会又提不起来他到底做些啥,下面就系统的复习一下service

  按照惯例先上一张图表面service的生命周期

  技术分享

  这里可以明确看到有两条线,也就是说一般而言service可以区分为两种,一种是开启服务(本地服务),一种是绑定服务(远程服务),这里先提一句,之前之所以说一般而言,是因为这两条线并不是完全独立的

  比方说,你可以和一个已经调用了 startService()而被开启的service进行绑定。

  比如,一个后台音乐service可能因调用 startService()方法而被开启了,稍后,可能用户想要控制播放器或者得到一些当前歌曲的信息,可以通过bindService()将一个activity和service绑定。这种情况下,stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。

 

A started service

  被开启的service通过其他组件调用 startService()被创建。

  这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它。

  当service被停止时,系统会销毁它。

 

A bound service

  被绑定的service是当其他组件(一个客户)调用bindService()来创建的。

  客户可以通过一个IBinder接口和service进行通信。

  客户可以通过 unbindService()方法来关闭这种连接。

  一个service可以同时和多个客户绑定,当多个客户都解除绑定之后,系统会销毁service。

 

不过,无论通过何种方法启动service,service都是需要在AndroidManifest.xml中声明的

 

<service android:enabled=["true" | "false"]
    android:exported=["true" | "false"]
    android:icon="drawable resource"
    android:isolatedProcess=["true" | "false"]
    android:label="string resource"
    android:name="string"
    android:permission="string"
    android:process="string" >
    . . .
</service>

 

 

  • android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。

  • android:name:对应Service类名

  • android:permission:是权限声明

  • android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。

  • android:isolatedProcess :设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。

  • android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。 

至于service的使用,这里就暂且不提,日后再加,不过其实使用起来可以当作后台的一个“工具”,其实也就是在它的各个生命周期内去实现所需要的方法

参考文档:

 

Android Service的生命周期

关于Android Service真正的完全详解,你需要知道的一切

 

Service