您现在的位置是:首页 > 正文

startService, bindService区别和总结

2024-02-01 06:41:38阅读 2

service有2种启动方式,startService和bindService。知识点包括以下几个方面(这里只说一些网上没有的):

一. 生命周期
(一) startService生命周期
1. onCreate() –> onStartCommand –> onDestroy()。
2. startService 在多个context里多次调用,只有第一次会调用service的onCreate(),所有的context调用startService都会重复调用service的onStartCommand(Intent intent, int flags, int startId),并且每次startId数字逐次递增,并且的调用的service是同一个对象实例(即第一次创建的那个)。
3. 一旦利用startService启动service,那么不管调用者context的生命周期是否结束(例如finish),service依然在后台运行,直至调用stopService,这是会回调service的onDestroy(),service的生命周期结束。
4. stopService(intent)可以多次调用且不报错,但是只有第一次能够起作用,调用到service的onDestroy()。

(二) bindService生命周期
1. onCreate() –> onBind() [ Activity–> onServiceConnected]–> onUnbind()。bindService方法在onCreate之前会调用service的构造函数,但是startService方法不会。
2. bindService在多个context里多次调用,只有第一次调用会调用service里的onCreate()和onBind()。后续的都不会触发这2个方法。
3. 利用bindService启动service之后,调用者如果生命周期结束(比如finish),那么会自动调用service的onDestroy(),但是service必须要所有bind/start过它的全部unbind/stop了才会结束生命周期。要注意service生命周期结束之前一定要记得调用unbindService(conn),否则会出现 leaked ServiceConnection错误。
4. unbindService(conn)只能调用一次,否则程序会崩溃。
5. onServiceDisconnected只会在service意外退出时调用,记得在这里回收一些资源。

二. 控制service
另外,我认为利用startService完全可以在任何Activity里来控制被启动过的service来做不同的事情,而不是网上说的完全失去了控制,因为我们完全可以利用intent带过去不同的值,在service里的onStartCommand里来判断intent里带来的值,从而达到控制的效果,经过测试时完全可以的,因为不同的activity之间利用startService启动的service是同一个对象实例。

三. 使用场景
一般说来,bindService使用的场景比较多。另外,混合使用的场景下,只有当所有的调用者释放掉一个service的bind引用(即unbindService),这个时候再用stopService(或者先stopService再释放所有的bind引用),这个service才会结束生命周期。

网站文章

  • SpringBoot使用Redis缓存 + @Cacheable, @CachePut, @CacheEvict注解使用

    SpringBoot使用Redis缓存 + @Cacheable, @CachePut, @CacheEvict注解使用

    目录 SpringBoot使用Redis缓存 Spring缓存注解@Cache使用 @Cacheable、@CachePut、@CacheEvict 注释介绍 SpringBoot使用Redis缓存 - gdpuzxs - 博客园 https://www.cnblogs.com/gdpuzxs/p/7222309.html SpringBoot使用Redis...

    2024-02-01 06:41:08
  • AES-128-CBC加解密方法:nodejs加密QT解密(附C语言版加解密全过程)

    服务器端使用的是nodejs编写的代码,对明文进行加密,客户端使用的是QT4.5.3编写代码,调用openssl crypto库函数,对密文进行解密。注意:加解密要对等,即加解密的秘钥相同,向量也要相同,由于是两种不同的语言写的代码,因此两边都要做好一致性检查,比如秘钥的处理,密文的编码方式等等。这里两边都对秘钥进行了MD5加密,并设置向量和秘钥一样(可自由设置秘钥和向量,我们的代码中处理...

    2024-02-01 06:41:02
  • 亿美软通出席硬核桃5G开发者社区周年庆,喜获“金核桃奖”

    亿美软通出席硬核桃5G开发者社区周年庆,喜获“金核桃奖”

    12月15日,亿美软通受邀出席硬核桃5G消息开发者社区周年庆活动。庆典现场,亿美软通CMO张翀对与硬核桃“结缘”一年来亿美在5G消息方面的发展成果做了分享,同时也针对“商用在即,5G消息CSP信息服务...

    2024-02-01 06:40:54
  • 逐行对比LLaMA2和LLaMA模型源代码

    逐行对比LLaMA2和LLaMA模型源代码

    这是因为键和值的数量直接影响了注意力矩阵和值矩阵的大小,如果序列长度非常大,这些矩阵的存储和计算可能会变得非常昂贵。在这种情况下,需要在计算注意力权重前,将键和值的头数通过复制的方式扩展到与查询头数一...

    2024-02-01 06:40:49
  • fork源码分析

    文章目录

    2024-02-01 06:40:24
  • 计算机语言bus代表什么,计算机中bus指什么

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。计算机中bus是指总线,总线的作用就是在计算机各部件之间传递信息,由数据总线,地址总线和控制总线组成。总线(Bus)是计算机各种功能...

    2024-02-01 06:40:17
  • 【漏洞复现】JDWP远程命令执行漏洞

    【漏洞复现】JDWP远程命令执行漏洞

    0x01 漏洞描述JPDA(Java Platform Debugger Architecture):即Java平台调试体系架构。Java虚拟机设计的专门的API接口供调试和监控虚拟机使用JPDA按照...

    2024-02-01 06:40:09
  • Node.js模块加载机制

    I. 使用require()加载自定义模块是,必须以./或者…/开头的路径标识符。在加载自定义模块时,如果没有指定./或者…/这样的路径标识符,则node会把它当作内置模块或者第三方模块进行加载。II...

    2024-02-01 06:39:41
  • 从源码分析:Java中的SPI是怎样工作的

    spi介绍提到api,大家或多或少地都接触或者使用过,但是如果说到spi呢,可能了解的人就要少一些。Java SPI的全...

    2024-02-01 06:39:33
  • 家用 文件服务器,家用文件服务器

    家用 文件服务器,家用文件服务器

    家用文件服务器 内容精选换一换远程桌面协议(Remote Desktop Protocol,RDP),是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器...

    2024-02-01 06:39:25