startService与bindService
Service的生命周期 Service的生命周期方法比Activity少一些,只有onCreate, onStart, onDestroy
我们有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
Service会经历 onCreate -> onStart
stopService的时候直接onDestroy
如果是调用者(TestServiceHolder)自己直接退出而没有调用stopService的
话,Service会一直在后台运行。
下次TestServiceHolder再起来可以stopService。
2 通过bindService
Service只会运行onCreate, 这个时候 TestServiceHolder 和TestService绑定在一起
TestServiceHolder 退出了,Srevice就会调用onUnbind->onDestroyed
所谓绑定在一起就共存亡了。
那有同学问了,要是这几个方法交织在一起的话,会出现什么情况呢?
一个原则是Service的onCreate的方法只会被调用一次,就是你无论多少次的startService又 bindService,Service只被创建一次。如果先是bind了,那么start的时候就直接运行Service的onStart方法,如果先 是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,对啊,就是stopService不好使了,只 能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
服务不能自己运行,需要通过调用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()方法.
我的补充案例:
为什么music player每个Activity unbindService后 musicservice仍在后台播放?
具体要看music service中的onBind()的实现,它里面的onBind()并没有直接去调用stotself()(它会检查当前是否有歌曲在播放),所以并不会直接就destroy,因此它还存在于后台继续播放。
转载于:https://www.cnblogs.com/tanqiantot/archive/2012/11/27/3126836.html
startService与bindService相关推荐
- [转]安卓开发startservice 和bindservice详解
原文 作者:aikongmeng 来源:安卓中文网 博主暗表:搜到此文,终于为我解惑,bindService并不会真正启动service,不会调用onStartCommand!还需要再bind之前st ...
- 深入理解Android的startservice和bindservice
一.首先,让我们确认下什么是service? service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级 ...
- Android之startService与bindService的区别
Android执行Service有两种方法,一种是startService,一种是bindService.下面让我们一起来聊一聊这两种执行Service方法的区别. 1.生命周期上的区别 执行star ...
- Android startService和bindService混合使用、以及前台服务;
Service简单来说就是一个看不见的Activity,在后台默默运行: 可以混合开启Service,无论先startService还是bindService: startService: Inten ...
- Android之startService()和bindService()区别
Android之startService()和bindService()区别 1. 生命周期: 执行startService时,Service会经历onCreate->onStartComman ...
- startService和bindService的区别
首先看下其生命周期的区别: 生命周期: onCreate → startCommand → onDestroy onCreate → onBind→onUnBind→ onDestroy 静态绑定对应 ...
- Android开发面试题Service之startService和bindService之间的区别
我们从生命周期来看: startService启动service会走=>onCreate和onStartCommand bindService启动service会走=>onCreate和o ...
- startService()和bindService()区别
1.从生命周期来看 startService()会调用service的onCreate().onStartCommand(),调用stopService()后就执行service的onDestroy( ...
- Service 定义(startService、bindService、IntentService)
Service: 是Android中实现程序后台运行的解决方案. 定义为服务 Service默认并不会运行在子线程中,它也不会运行在一个独立的进程中,它同样执行在UI线程中,因此,不要在Service ...
最新文章
- pstree进程管理
- sentinel使用(结合gateway)
- 禁用当前的账户win7_拯救你的win7系统,电脑优化到位,打游戏才会流畅
- es6 ...展开运算符
- 4.RabbitMQ 4种交换模式
- Android之用Intent.FLAG_ACTIVITY_CLEAR_TOP解决界面重复拉起问题
- 一个数据仓库转型者眼中的数据挖掘
- 95-850-020-源码-心跳-JobMaster与TaskExecutor之间的心跳检测
- 高通驱动9008安装_小米10/Redmi K30 Pro系列已支持GPU驱动独立更新,还能双版本切换...
- ‘nvidia-smi‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- ASP.NET开发学习视频教程大全(共800集)
- photoshop制作透明背景图片1
- win10总是更新失败
- 股票中的KDJ三根线分别代表什么?
- Pytest + Allure 测试报告定制
- An unexpected error prevented the server from fulfilling your request. (HTTP 500)
- 企业如何做好数据防泄漏需求分析
- 配置局域网内电脑快速传输数据
- matlab升幂降幂排列,升幂排列与降幂排列
- xp系统远程桌面关闭计算机,WinXP如何打开远程桌面?WinXP打开远程桌面的命令是什么?...
热门文章
- 从零开始刷Leetcode——数组(122.167.169)
- efficientnet-yolo3-tf2的实现
- 抽取CNN网络任意层的特征,VGG模型fine-tuning实践
- 昔年浅谈电商服务业务应如何推广
- 计算机信息机房,计算机信息中心机房建设标准
- mysql 二进制 查询_MySql如何插入和查询二进制数据_MySQL
- python实现编辑距离以及回溯路径
- 压缩等级_魔兽世界:9.0会落实等级压缩吗,简单分析一下压缩等级的好处
- python 计时器_谁能取代Python?我使用Go来部署机器学习模型的原因
- 通过XMPP协议实现推送信息