Service 做为 Android 的四大组件仍是颇有必要好好掌握一下的!微信
先从 Service 生命周期看起,Service 的生命周期比较有趣的一点是,它的生命周期会根据调用不一样的方法启动有不一样的表现,具体有两种形式。code
经过 startService(Intent intent) 启动 Servicecdn
生命周期是这样的: onCreate()
、onStartCommand()
、onStart()(已通过时)
、onDestroy()
生命周期
经过 bindService(Intent intent,ServiceConnection conn,int flags) 启动 Serviceget
生命周期是这样的:bindService()
、onCreate()
、IBinder onBind(Intent intent)
、unBindService()
、onDestroy()
方法。it
前面说了,经过 startService()
启动 Service 会执行 onCreate()
、onStartCommand()
、onDestroy()
方法。注意:当调用 startService(Intent intent) 后,以后只执行一次 onCreate()
方法,反复屡次调用 startService 后,Service 只会重复执行 onStartCommand
onStart()(已通过时)
方法。调用 stopService 后 Service 只执行一次 onDestroy
方法。io
能够看到经过这种方式启动 Service ,这个时候的 Service 几乎和 Activity 不能交互(不考虑全局变量的方式),在 Service 里面也没有 getIntent()
方法。class
既然经过 startService 启动的 Service 和 Activity 没有创建联系,那么经过 bindService 来启动 Service,就能够和 Activity 创建联系了,至关于 Service 绑定到了这个 Activity 中了。变量
经过 bindService(Intent intent ,ServiceConnection connetion,int flag) 启动 Service 后 Service 的正常的生命周期是:onCreate、onBind、ibinder 会做为参数传递到 connect 中的 onServiceConnected 方法中,绑定后,再次执行 bindService Service 什么都不执行。service
Activity 在没有 bindService 的状况下,调用 unBindService(ServiceConnection serviceConnection) 是会 crash 的。不管在什么状况下,对于某个 Activity,只可以执行一次 unBindService。由于执行完一次 Service就再也不注册 serviceConnection 了,再次 unBinderService 就会出现错误 Service not registered:MainActivity$ServiceConnection$
只有在单独执行 bindService (执行 bindService 先后没有执行 startService)的状况下,执行 unBindService 才会正常执行 Service 的 onDestroy 方法。
宿主 Activity 退出,不会正常执行 Service 的 onDestroy 方法。
BIND_AOUT_CREATE
表示在 Activity 和 Service创建关联后自动建立 Service。其实上面的标志位目前做用不大,这个阶段大可没必要细究。可是为了知足心理须要,我仍是大致解释一下可使用的参数。(放到下一篇吧)
上面介绍的都是在单独执行 startService 或者 binService 的状况下。
当既执行了 startService 又执行了 binService 的时候(不区分顺序),只有执行过 stopService 和unBindService 的时候(不区分顺序)才执行 onDestroy 方法。
任何一个 Service 在整个应用程序范围内都是通用的。即 MyService 不只能够和 MainActivity 创建关联,还能够和任何一个 Activity 创建关联。若是 Service 和多个 Activity 绑定,则只有这个 Service 与 全部 Activity 接触绑定后,才会执行 onDestroy 方法。(若是 Activity 被销毁了,也认为 Service 和这个 Activity 解除了绑定)若是在某个 Activity 调用 startService 后,Service 就被启动了,这个时候,不管你在哪一个 Activity 内再调用 startService 效果就和上面分析的屡次调用 Service 效果是同样的。
以上是简单概念,还有下篇。