Android组件管理框架—后台服务Service之生命周期(Android P)

一 Service生命周期

                                            

startService()

手动调用context.startService:onCreate()——onStartCommand()(service running)

手动调用context.stopService:onDestroy()

注意:(1) service被startService启动多次,onCreate()只会执行一次;所以,stopService()也只会调用一次。

          (2) 如果已经onCreate(),那么startService()将只调用startCommand(),onStartCommand()调用次数=startService()调用次数。

          (3) service可以无限运行下去,必须调用stopSelf()或其它组件调用stopService()停止。

 

 2 bindService()

手动调用context.bindService():onCreate()——onBind()(service running)

手动调用context.unbindService(): onUnbind()——onDestroy()

注意:(1) 多次调用bindService()方法,创建服务onCreate()只会调用一次;onBind()只会调用一次。

          (2) 客户端client可以通过IBinder接口获取Service实例,从而可以实现在client端直接调用Service中的方法以实现灵活的交互,并且可借助IBinder实现跨进程的client-server的交互,在startService启动的Service中是无法实现的。
          (3) 调用Context.unbindService() 断开连接;或调用bindService() 的 Context 不存在了(比如Activity被finish),系统将会自动停止service,对应onDestroy将被调用。

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

 

3 startService()+bindService()

一个已经调用startService()而被开启的service,也可以调用bindService进行绑定。

手动调用context.startService:onCreate()——onStartCommand()(service running)

手动调用context.bindService():onCreate()——onBind()

手动调用context.unbindService(): onUnbind()

手动调用context.stopService:onDestroy()

注意:(1) startService()和stopService()只能开启和关闭service,无法操作service;bindService()和unbindService()可以操作service。

          (2) startService()开启service,调用者退出后service仍然存在;bindService()开启service,调用者退出后,随着调用者销毁。

          (3) 调用了startService()和bindService(),要停止service,则需要调用stopService()或stopSelf(),并且所有的客户解除绑定;所以单独调用unbindService()也不会停止service。

 

二 生命周期方法

onCreate() 
       首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前);如果服务已在运行,则不会调用此方法。可以在onCreate方法中完成一些Service初始化相关的操作。

onStartCommand() 
      当另一个组件通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 实现此方法,则在服务工作完成后,需要通过调用 stopSelf() 或 stopService() 来停止服务。如果多次执行了Context的startService方法,那么Service的onStartCommand方法也会相应的多次调用。onStartCommand方法很重要,在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等。

      onStartComand返回的是一个(int)整型,这个整型有四个返回值,它们的含义分别是:
(1) START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
(2) START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
(3) START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
(4) START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。

onBind() 
       调用bindService()绑定服务后,将会执行该方法。Service中的onBind方法是抽象方法,所以Service类本身就是抽象类,也就是onBind方法是必须重写的,即使我们用不到。在此方法的实现中,必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信;如果并不希望允许绑定,则应返回 null。

onUnbind() 
      当所有绑定的客户端解除绑定时,系统将会调用该方法。 

onDestory() 
      当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源。 当组件需要停止一个启动服务时,需要调用stopService();解除绑定服务时,需要调用unbindService()。


 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值