1.Service的生命周期

        Android中的Service(服务)与Activity不同,它是不能和用户交互,不能自己启动的,运行在后台的程序,如果我们退出应用的时候,Service进程并没有结束,它仍然在后台运行,那我们什么时候用到Service呢?比如我们播放音乐时,有可能想边听音乐边干些其他事情,当我们退出音乐播放应用,如果不用Service,我们就听不到音乐了,所以这个时候我们就要用到Service了,又比如当我们一个应用的数据的通过网络获得。不同时间(一段时间)的数据是不同的。这个时候我们可以用Service在后台定时更新,而无须每次打开应用的时候去获取。

        Android Service的生命周期并不像Activity那么复杂,它只是继承了onCreate(),onStartCommand(),onDestroy()三个方法,当我们第一次启动Service时,先后调用onCreate()和onStartCommand()这两个方法,当停止Service时候,我们就会执行onDestroy()方法。

       这里需要注意的是,如果Service已经启动了,当我们再次启动的Service时候,不会再次执行onCreate()方法,而是直接执行onStartCommand方法。

注意:

  onStart方法是在Android2.0之前的平台使用的。在2.0及其之后,则需重写onStartCommand方法,同时,旧的onStart方法则不会再被直接调用(外部调用onStartCommand,而onStartCommand里会再调用 onStart。在2.0之后,推荐覆盖onStartCommand方法,而为了向前兼容,在onStartCommand依然会调用onStart方法)。

2.startservice 和bindservice详解

 Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy。我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。

(1) 通过startService

context.startService() ->onCreate()- >onStartCommand()->Service running-->(若context.stopService())->onDestroy() ->Service shut down

Service会经历 onCreate --> onStartCommandstopService的时候直接onDestroy

  如果是调用者直接退出而没有调用stopService的话,Service会一直在后台运行。

  下次调用者再起来仍然可以stopService。

(2) 通过bindService

context.bindService()->onCreate()->onBind()->Service running-->(若context.unbindService())-->onUnbind() -> onDestroy() ->Service stop

Service只会运行onCreate, 这个时候调用者和Service绑定在一起。调用者退出了,Srevice就会调用onUnbind-->onDestroyed,所谓绑定在一起就共存亡了。

  注意:Service的onCreate的方法只会被调用一次,

  就是你无论多少次的startService又 bindService,Service只被创建一次。

  如果先是bind了,那么start的时候就直接运行Service的onStart方法,

  如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,

  只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

(3)小结:

  Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。

  这两个方法都可以启动Service,但是它们的使用场合有所不同:

                   使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服务仍然运行。

                   使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。

  如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,

  接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,

  但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

  如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,

  接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,

  接着调用onDestroy()方法。

       如果调用bindService()方法前服务已经被绑定,

  多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

  如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法.

3. startService 与 bindService 共同使用(混合模式)

startService->bindService  或者 bindService  ->startService,顺序无所谓

例子一:按顺序1,2,3,4执行

(1)startService:调用onCreate()->onStartCommand()

(2)bindService:调用onBind()

(3)stopService:没有调用onDestory()    Service仍然在运行!

(4)unbindService:调用onUnbind()->onDestory()    此时Service关闭!

 

例子二:将例子一3,4调换

(1)startService:调用onCreate()->onStartCommand()

(2)bindService:调用onBind()

(3)unbindService:调用onUnbind()    Service仍然在运行!

(4)stopService:调用onDestory()     此时Service才关闭!

  上面的微妙变化,我们可以得出一个结论:停止服务销毁服务是两个不同的概念,虽然我们调用了stopService去停止服务,但是服务仍然木有销毁,依然坚挺的运行着。直至我们调用了onUnbind,与Service关联的client都解绑以后,Android系统才调用onDestroy将其销毁

转载于:https://www.cnblogs.com/hebao0514/p/4738780.html

Android(java)学习笔记114:Service生命周期相关推荐

  1. 【前端学习】React学习笔记-事件、生命周期、虚拟DOMdiffing

    跟着尚硅谷的天禹老师学习React 看视频可以直接点击 b站视频地址 React中的事件处理 补充ref 上面的ref在React官网中提到不要被过度使用,在一些情况下可以使用其他方法来获取数据,比如 ...

  2. Web前端学习笔记:Vue生命周期理解

    一.感谢原创博主 示例代码出处====vue2.0 探索之路--生命周期和钩子函数的一些理解 官方文档 二.生命周期简单描述 总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后. 创建前/ ...

  3. Spring.NET学习笔记(5)-对象生命周期和创建者对象

    一.对象生命周期 说白了就是一init初始化方法和Dispose方法 两种实现方式 1.实现接口方法(造成耦合,放弃),IInitializingObject / init-method和IDispo ...

  4. Spring学习笔记八--Bean生命周期和后置处理器

    为什么80%的码农都做不了架构师?>>>    Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...

  5. 少侠请重新来过 - Vue学习笔记(二) - Vue生命周期

    Vue 生命周期和钩子 每一个vue实例创建时,会经历一段初始化的过程,同时会调用其生命周期钩子,实例的钩子this指向它的Vue实例,不需要在钩子用箭头函数. <template>< ...

  6. iOS初级开发学习笔记:APP生命周期的学习总结

    我们平常使用APP时,一般人都会知道有:简单的正在使用状态:通过home键等方式离开应用,但是不关闭应用,即后台状态:以及调出后台程序管理后向上滑动将应用"杀死",三种状态.而我们 ...

  7. 传播智客学习笔记--L27 Activity生命周期

    将Activity设置为对话框样式 生命周期示意图 Activity 四种启动模式 转载于:https://www.cnblogs.com/lya-nju/p/4231026.html

  8. Java Web 学习笔记3 Servlet生命周期

    https://www.bilibili.com/video/av31486135/?spm_id_from=333.788.videocard.0 环境:Eclipse 2019-06 (4.12. ...

  9. Android复习10【Service与Thread的区别、Service的生命周期、Service生命周期解析(相关方法详解、启动方式的不同、绑定)、音乐播放器+服务】

    音乐播放器Android代码下载:https://wws.lanzous.com/ifqzihaxvij 目   录 Service与Thread的区别 Service的生命周期 Service生命周 ...

最新文章

  1. ValueError: Bin labels must be one fewer than the number of bin edges
  2. 利用intellijidea创建maven多模块项目
  3. python选课系统_【精选】在Monash读Data Science,人人都拥有这样一份选课指南。
  4. 小明分享|基于VSCode Espress IDF软件环境搭建
  5. 你和女朋友的婚后老年生活!
  6. oracle数据库支持2颗cpu,2.3 Oracle数据库中常见的性能问题
  7. JavaScript 删除Cookie
  8. 如何设置cout的输出格式(转)
  9. Android Studio的Project有某个项目,Build Variants却没有,如何添加物已有项目?
  10. SQL语句执行优先级
  11. 推荐算法(一)电影推荐系统
  12. 8、ESP8266 深度睡眠
  13. Unity3D学习笔记(1)编辑器概括
  14. 免费的WebService服务器
  15. 卫星定位原理以及室内定位技术
  16. 【MySQL】navicat for mysql 安装及使用
  17. HDU 4607 Park Visit HDU暑期多校1
  18. 计算机博士差国际期刊能申请答辩吗,科学网—申请授予博士学位和发表SCI论文挂钩没毛病 - 马军的博文...
  19. 蓝桥杯 试题 基础练习 Sine之舞 c语言
  20. 云数据库被黑客攻击了

热门文章

  1. 'qapplicationapp'在此作用域中尚未声明 linux,qt 编译问题总结
  2. android 录音命令,音频延迟  |  Android NDK  |  Android Developers
  3. git 使用分支基础
  4. 我的YUV播放器MFC小笔记:注册表读写
  5. oracle 切割字符串加引号_oracle存储过程中单引号及字符串拼接处理
  6. 【es】client通信流程与负载均衡
  7. 95-40-115-java.util.concurrent-线程-AbstractExecutorService
  8. 【lucene】Lucene Tika 操作各种文件
  9. 【Clickhouse】Clickhouse 运算符 操作符 算术,比较,取整,逻辑,哈希,条件 字符串函数
  10. 60-10-060-命令-kafka-run-class.sh