android service生命周期
2016-01-09 19:31
471 查看
service生命周期图:
![](http://img.blog.csdn.net/20160109193136653?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(1).png)
Android Service的生命周期只继承了activity的onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行[b]onDestroy()方法。[/b]
注意:如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
服务分为两种:
1、本地服务:
[b]Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。[/b]
2、远程服务:
[b]Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。[/b]
启动服务:
context.startService() ->onCreate()- >onStartCommand()->Service
running--
调用context.stopService()
->onDestroy()
context.bindService()->onCreate()->onBind()->Service
running--调用>onUnbind() -> onDestroy()
总结:
1.onCreate(Client首次startService(..)) >> onStartCommand >> onStartCommand - optional ... >> onDestroy(Client调用stopService(..))
注:onStartCommand(..)可以多次被调用,onDestroy()与onCreate()想匹配,当用户强制kill掉进程时,onDestroy()是不会执行的。
2.对于同一类型的Service,Service实例一次永远只存在一个,而不管Client是否是相同的组件,也不管Client是否处于相同的进程中。
3.Service通过startService(..)启动Service后,此时Service的生命周期与Client本身的什么周期是没有任何关系的,只有Client调用stopService(..)或Service本身调用stopSelf(..)才能停止此Service。当然,当用户强制kill掉Service进程或系统因内存不足也可能kill掉此Service。
4.Client A 通过startService(..)启动Service后,可以在其他Client(如Client B、Client C)通过调用stopService(..)结束此Service。
5.Client调用stopService(..)时,如果当前Service没有启动,也不会出现任何报错或问题,也就是说,stopService(..)无需做当前Service是否有效的判断。
6.startService(Intent serviceIntent),其中的intent既可以是显式Intent,也可以是隐式Intent,当Client与Service同处于一个App时,一般推荐使用显示Intent。当处于不同App时,只能使用隐式Intent。
当Service需要运行在单独的进程中,AndroidManifest.xml声明时需要通过android:process指明此进程名称,当此Service需要对其他App开放时,android:exported属性值需要设置为true(在有intent-filter时默认值就是true)。
![](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image(1).png)
Android Service的生命周期只继承了activity的onCreate(),onStart(),onDestroy()三个方法,当第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行[b]onDestroy()方法。[/b]
注意:如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
服务分为两种:
1、本地服务:
[b]Local Service 用于应用程序内部。在Service可以调用Context.startService()启动,调用Context.stopService()结束。 在内部可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。无论调用了多少次startService(),都只需调用一次 stopService()来停止。[/b]
2、远程服务:
[b]Remote Service 用于android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服 务。调用Context.bindService()方法建立连接,并启动,以调用 Context.unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。[/b]
启动服务:
context.startService() ->onCreate()- >onStartCommand()->Service
running--
调用context.stopService()
->onDestroy()
context.bindService()->onCreate()->onBind()->Service
running--调用>onUnbind() -> onDestroy()
总结:
1.onCreate(Client首次startService(..)) >> onStartCommand >> onStartCommand - optional ... >> onDestroy(Client调用stopService(..))
注:onStartCommand(..)可以多次被调用,onDestroy()与onCreate()想匹配,当用户强制kill掉进程时,onDestroy()是不会执行的。
2.对于同一类型的Service,Service实例一次永远只存在一个,而不管Client是否是相同的组件,也不管Client是否处于相同的进程中。
3.Service通过startService(..)启动Service后,此时Service的生命周期与Client本身的什么周期是没有任何关系的,只有Client调用stopService(..)或Service本身调用stopSelf(..)才能停止此Service。当然,当用户强制kill掉Service进程或系统因内存不足也可能kill掉此Service。
4.Client A 通过startService(..)启动Service后,可以在其他Client(如Client B、Client C)通过调用stopService(..)结束此Service。
5.Client调用stopService(..)时,如果当前Service没有启动,也不会出现任何报错或问题,也就是说,stopService(..)无需做当前Service是否有效的判断。
6.startService(Intent serviceIntent),其中的intent既可以是显式Intent,也可以是隐式Intent,当Client与Service同处于一个App时,一般推荐使用显示Intent。当处于不同App时,只能使用隐式Intent。
当Service需要运行在单独的进程中,AndroidManifest.xml声明时需要通过android:process指明此进程名称,当此Service需要对其他App开放时,android:exported属性值需要设置为true(在有intent-filter时默认值就是true)。
相关文章推荐
- 学习Android中设计模式的笔记和总结(二)
- Android基础之SharedPreferences
- Android中的ANR如何分析又如何避免
- android studio 不支持 .9图片?
- Android 简单的3D旋转
- wifi功能 Android
- Android活动的生命周期
- Android 改变屏幕亮度时需添加权限
- [那些年踩过的坑]Android5.0 新控件的一些注意点(持续更新
- 如何改变Android Dialog弹出后的Activity背景亮度
- [Android Studio]API level
- Android studio 使用github上的android开源项目
- Android万能适配器base-adapter-helper的源代码分析
- Android Dex65536方法数,热补丁方案,动态加载apk小结
- Android拍照,选择图片,裁剪和上传服务器
- Android进阶笔记:bindService的流程--源码解析
- android sip 开发中SipManager.newInstance()return null 解决方法
- Android硬件抽象层学习
- 迁移ADT/ANT构建的Android项目至Gradle,a walk through。
- android监听软键盘,计算软键盘高度