Android随笔-Service

1.Service作用:

提供需要长期在后台长期运行的服务(如复杂计算、下载等),主要是因为它没有长的生命周期、没有用户界面、在后台运行。

2.Service分类:

本地:运行在主线程,主线程终止后服务也会终止。但是能够节约资源,并且通信方便,由于在同一进程不需要IPC和AIDL,主要使用在需要依附某个进程的服务,音乐播放等。
远程:运行在独立进程,常驻在后台,不受其他Activity影响但是非常消耗资源,通讯需要比较复杂,主要使用在系统级别的服务。
前台:通知栏可以显示出来,用户可以看到,主要使用在需要让用户只要并进行相关操作,如音乐播放。
后台:主要是用户无法看到,主要使用在不需要让用户知道的一些操作,跟新数据,同步数据等

3.生命周期

· 如果Service是第一次启动先会执行 onCreate(),onStartCommand()
· 当次启动Service调用,将只执行onStartCommand(),因为此时Service已经创建了,无需执行onCreate()回调。无论多少次的启动Service,只需要一次stopService()即可将此Service终止,执行onDestroy()函数。
· onStartCommand(..)可以多次被调用,onDestroy()与onCreate()相匹配,当用户强制kill掉进程时,onDestroy()是不会执行的。
· startService(Intent serviceIntent),其中的intent既可以是显式Intent,也可以是隐式Intent,当Client与Service同处于一个App时,一般推荐使用显示Intent。当处于不同App时,只能使用隐式Intent。
· 当Service需要运行在单独的进程中,AndroidManifest.xml声明时需要通过android:process指明此进程名称,当此Service需要对其他App开放时,android:exported属性值需要设置为true.

4.通讯

  1. 简单通信
    直接通过Intent进行传值,我们在启动一个Service的时候通过Intent的对象向Service进行传值,这种方式传递值比较不方便,性能不是很高。
    传值:



    获取值:


2.绑定服务传输数据
在Service中编写Binder的内部类,自定义方法进行数据传输。
活动类:



服务类:


  1. 通过使用Messenger方式(可以在不同进程间通讯)
    服务端:



    客户端


5.服务单独运行在进程

在XML文件中给Service添加process属性,有两种赋值方式,一种是[:xxxxx],一种是[com.pw.xxx.xxx] 第一种赋值是一种简写,完整的写法是[com.xxx.xxx:xxxx]这样的进程是应用的私有进程,其他应用不会跟它跑到同一个地方去。而第二种就是一种全局进程,其他的应用程序可以通过ShareUID跑进去。
多进程的使用地方,可以使用在一些需要保活的地方,音乐后台播放,在退出activity后还能继续播放、加载大图、推送服务,能够在程序退出后继续的向用户推送东西。将功能独立的分开来,减少程序崩溃