美文网首页
Service两种生命周期以及区别

Service两种生命周期以及区别

作者: 挖打发 | 来源:发表于2021-03-21 01:15 被阅读0次

    一:简介

      Service是Android的四大组件之一,它是用来进行后台操作的,它并不为用户提供界面,所有的操作都在后台完成,它的所有操作对用户都是不可见的。一旦其他的组件启动了一个Service,它会在后台一直运行,即便是用户切换到了其他的应用中。其他的组件也可以绑定Service进而启动一个Service,甚至可以用它来进行IPC(进程通信,inter process communication). Service可以进行的操作有很多,比如说网络通信,音乐播放,文件的I/O操作,以及和Content Provider进行交互。

    启动(start)

      当其他的组件(比如Activity)调用startService()方法时,就会启动Service。一旦启动Service之后,即便是启动它的组件被销毁了,对这个Service也没有影响,它仍然在后台运行。通常来说,一个Service执行单一的操作后,它应该自行结束自己的生命周期,但是并不会向启动它的组件返回结果。

    绑定(bound)

      其它的组件调用bindService()可以绑定一个Service,绑定之后,可以与这个组件进行类似于客户端的操作,比如发送请求,返回结果,甚至还可以进行进程通信。只要有其他的组件绑定到Service上,这个Service就可以运行。一个Service可以被多个组件绑定,当所有绑定它的组件都解除绑定之后,这个Service就停止运行,进而被销毁。

      虽然有两种方法可以启动Service,但是这两种方法并不冲突,当使用onStart()方法启动Service之后,同样还可以再使用onBind()方法绑定,只不过生命周期的几个回调函数会调用的稍有不同。

    注意: Service是运行于寄主进程的主线程中,也就是说,一个Service启动的时候,它不会创建一个新的线程,也不会新开一个进程,除非你自己开一个进程。所以当你使用Service进行一些耗费CPU的操作时,最好新开一个线程,以减少ANR错误。

    二: Service的生命周期:

    1、Started Service的生命周期:

    onCreate():创建服务

    onStartCommand():服务开始运行(在2.0以前版本中,使用onStart()回调方法)

    onDestroy() :服务被停止

    【详细说明:】

    在程序中调用context.startService(): 会触发执行Service生命周期中的onCreate()、onStartCommand()回调方法,此时服务就开始正式运行;

    如果Service还没有运行,则android先调用onCreate()然后调用onStartCommand();如果Service已经运行,则只调用onStartCommand(),所以一个Service的onStartCommand方法可能会重复调用多次;

    如果在程序中调用context.stopService():会触发执行Service生命周期中的onDestroy()回调方法,会让服务停止;

    stopService()的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService()的话,Service会一直在后台运行。该Service的调用者再启动该Service后可以通过stopService关闭Service;stopSelf()

    所以StartService的生命周期为:onCreate –> onStartCommand(可多次调用) –> onDestroy。

    2、Bound Service的生命周期:

    onCreate():创建服务

    onBind():绑定服务,服务开始运行

    onUnbind():取消绑定

    onDestroy() :服务被停止

    【详细说明:】

    在程序中调用:context.bindService()会触发执行Service生命周期中的onCreate()、onBind()回调方法,此时服务开始运行;

    onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。此后调用者(Context,例如Activity)会和Service绑定在一起;

    如果调用Service的调用者Context退出了,那么会依次调用Service生命周期中的onUnbind()、onDestroy()回调方法,会让服务停止;

    所以BindService的生命周期为:onCreate –> onBind(只一次,不可多次绑定) –> onUnbind –> onDestory。

    【备注:】

    Service是不能自己启动的,只有通过 Context 对象调用startService() 和bindService() 方法来启动。

    在Service每一次的开启关闭过程中,只有onStartCommand()可被多次调用(通过多次startService调用),其他onCreate()、onBind()、onUnbind()、onDestory()在一个生命周期中只能被调用一次。

    Service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务总是藏在后头的

    相关文章

      网友评论

          本文标题:Service两种生命周期以及区别

          本文链接:https://www.haomeiwen.com/subject/fkagcltx.html