Android之Servie生命周期探索

Service的生命周期

1.Service生命周期的回调方法

        onCreate():首次创建Service;
        onStartCommand():当另一组件调用startService()启动Service;
        onDestroy():当Service不再使用且将要销毁;
        onBind():当另一组件调用bindService()与Service绑定时,系统将调用此方法;
        onUnbind():当另一组件调用unbindService()与Service解除绑定时系统将调用此方法;
        onRebind():当旧的组件与Service解绑后另一新组件与Service绑定,onUnbind()返回true时,系统将调用此方法;

2.非绑定模式

        第一次调用startService()时候执行的方法依次为onCreate()、onStartCommand()、onStart(),当Service关闭的时候调用onDestroy();

调用
to
to
to
startService
onCreate
onStartCommand
onStart
onDestroy

        调用Context的startService()方法,相应的服务就会启动起来,并回调 onStartCommand()方法。如果这个服务之前还没有创建过,onCreate()方法会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到stopService()或 stopSelf()方法被调用。
        虽然每调用一次startService()方法,onStartCommand()就会执行 一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次 startService()方法,只需调用一次 stopService()或 stopSelf()方法,服务就会停止下来了。

3.绑定模式

        第一次调用bindService(),执行的方法依次为onCreate()、onBind(),解除绑定的时候会执行onUnbind()、onDestroy()。

调用
to
to
to
bindService
onCreate
onBind
onUnbind
onDestroy

        调用 Context 的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于 onBind()方法执行。之后,调用方可以获取到 onBind()方法里返回的 IBinder 对象的实例,这样就能自由地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。
        调用startService()后又去调用 stopService()方法,这时服务中的 onDestroy()方法就会执行,表示服务已经销毁了。
        调用bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。


Service创建到销毁生命周期过程

Start服务

        其他组件调用startService()创建然后保持运行,必须通过调用stopSelf()自行终止。其他组件也可以通过调用stopService()终止这类服务。服务终止后系统会把它销毁。
        如果一个Service被startService()方法多次启动,onCreate()方法也只调用一次,onStart()方法将会被多次调用,系统只会创建一个Service实例,所以stopService只需要调用一次就可以停止服务。该Service将会一直在后台运行不管对应程序的Activity是否在运行,直到调用stopService(),或者自身调用stopSelf()。
        如果系统资源不足,Android系统也可能结束服务。

Bind服务

        调用bindService()创建,然后客户通过一个IBinder接口与服务进行通信,客户端可以通过unbindService()来关闭连接。多个客户端可以绑定在同一个服务上,当所有的客户端都解除绑定后,系统会销毁服务(Bind服务不需要自行终止)。
        如果一个Service被某个Activity调用Context.bindService方法绑定启动,不管调用bindService几次,onCreate()方法都只会调用一次,同时onStart()方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService()断开连接或者之前调用bindService()的Context不存在了,系统将会自动停止Service,对应onDestroy()将被调用。
        可以绑定到一个已经用startService()启动的服务上,这种情况stopService()或stopSelf()不会真的终止服务,除非所有的客户端都解除了绑定。



onStartCommand()返回值介绍

        START_STICKY
        如果Service进程被Kill,保留Service的状态为开始状态,但不保留递送的Intent对象。随后系统会尝试重新创建Service,由于服务为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法,如果在此期间没有任何启动命令被传递到Service,那么参数Intent将为null;
        START_NOT_STICKY
        非黏性,使用这个返回值如果在执行完onStartCommand后Service被异常Kill,系统不会自动重启该服务;
        START_REDELIVER_INTENT
        重传Intent使用这个返回值,如果在执行完onStartCommand()后Service被异常Kill,系统会自动重启该服务,将该Intent的值传入。
        START_STICKY_COMPATIBILITY
        START_STICKY的兼容版本,不保证服务被Kill后一定能重启;


onCreate()方法和onStartCommand()到底有什么区别?

        Service的onCreate()和onStartCommand()方法的区别跟Activity的onCreate()和onStart()方法区别差不多。
        onCreate()方法是在Service第一次创建的时候调用的,onStartCommand()在每次启动服务的时候都会调用,由于是第一次点击 Start Service按钮,Service此时还未创建过,所以两个方法都会执行,之后如果你再连续多点击几次 Start Service按钮,就只有 onStartCommand()方法可以得到执行了。


onRebind(Intent)在什么情况下执行

        在onUnbind()方法返回true的情况下会执行。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值