首页 > IT职业 > IT职场 > Android Service 详解(上)
Service 作为 Android 的四大组件还是很有必要好好掌握一下的!
先从 Service 生命周期看起,Service 的生命周期比较有趣的一点是,它的生命周期会根据调用不同的方法启动有不同的表现,具体有两种形式。
通过 startService(Intent intent) 启动 Service
生命周期是这样的: onCreate() 、onStartCommand()、onStart()(已经过时) 、onDestroy()
通过 bindService(Intent intent,ServiceConnection conn,int flags) 启动 Service
生命周期是这样的:bindService()、onCreate() 、IBinder onBind(Intent intent)、unBindService()、onDestroy() 方法。
前面说了,通过 startService() 启动 Service 会执行 onCreate()、onStartCommand()、onDestroy() 方法。注意:当调用 startService(Intent intent) 后,之后只执行一次 onCreate() 方法,反复多次调用 startService 后,Service 只会重复执行 onStartCommand onStart()(已经过时) 方法。调用 stopService 后 Service 只执行一次 onDestroy 方法。
可以看到通过这种方式启动 Service ,这个时候的 Service 几乎和 Activity 不能交互(不考虑全局变量的方式),在 Service 里面也没有 getIntent() 方法。
既然通过 startService 启动的 Service 和 Activity 没有建立联系,那么通过 bindService 来启动 Service,就可以和 Activity 建立联系了,相当于 Service 绑定到了这个 Activity 中了。
通过 bindService(Intent intent ,ServiceConnection connetion,int flag) 启动 Service 后 Service 的正常的生命周期是:onCreate、onBind、ibinder 会作为参数传递到 connect 中的 onServiceConnected 方法中,绑定后,再次执行 bindService 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 方法。
第一个参数就是要绑定的 Service 的intent 就不多说了
第二个参数就是 Service 和 Activity 建立联系使用的
标志位,和启动的 Service 的优先级有关,一般就是传入: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 效果是一样的。
作者:sydMobile
链接:https://www.jianshu.com/p/d88020de60b1
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3112/viewspace-2821574/ ,如需转载,请注明出处,否则将追究法律责任。