Android入门篇(七) Service生命周期

news/2024/2/29 4:00:30

前面讲完了四大组件中的Activity,这里在讲解一下另一个重要的的组件Service。Service常见的场景可以应用于后台应用的下载,或者是后台的轮询操作。后台执行一些耗时的操作。

Service的启动

service启动的方式主要有两种:

  1. startService启动service
  2. bindService启动service

两种启动方式的区别:

  1. startService启动Service
  • 首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service 进入运行状态,如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!
  • Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!
  • 无论启动了多少次Service,只需调用一次StopService即可停掉Service
  1. BindService启动Service
  • 当首次使用bindService绑定一个Service时,系统会实例化一个Service实例,并调用其onCreate()和onBind()方法,然后调用者就可以通过IBinder和Service进行交互,此后如果再次使用bindService绑定Service,系统不会创建新的Sevice实例,也不会再调用onBind()方法,只会直接把IBinder对象传递给其他后来增加的客户端!
  • 如果我们解除与服务的绑定,只需调用unbindService(),此时onUnbind和onDestory方法将会被调用!这是一个客户端的情况,假如是多个客户端绑定同一个Service的话,情况如下 当一个客户完成和service之间的互动后,它调用 unbindService() 方法来解除绑定。当所有的客户端都和service解除绑定后,系统会销毁service。(除非service也被startService()方法开启)
  • bindService模式下的Service是与调用者相互关联的,在bindService后,一旦调用者销毁,那么Service也立即终止!

Service生命周期

这里进行测试

  • 通过startService方式启动

    public void start(View view) {Intent intent = new Intent(SecondActivity.this, FirstService.class);startService(intent);
    }public void stop(View view) {Intent intent = new Intent(SecondActivity.this, FirstService.class);stopService(intent);
    }

    首次启动service

    04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate
    04-25 21:55:17.525 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand

    从日志中可以看出,当start依次调用了oncreate和onStartCommand

    第二次启动service
    `04-25 22:00:34.075 1263-1263/com.isdust.zor.view_learn D/FirstService: onStartCommand

`
这里可以视为两次启动了service,看一下stopservice的情况
04-25 22:04:37.325 1263-1263/com.isdust.zor.view_learn D/FirstService: onDestroy
可以看到只调用了依次destory,因此,可以明确的看出service不会生成多次
这种情况下,service和activity没有必然的联系。当activitydestroy后,service依然运行。

  • BindService方式

bindservice时

04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onCreate
04-25 22:10:43.005 1263-1263/com.isdust.zor.view_learn D/FirstService: onBind

可以看到首次bind时,只是调用了onCreate和onBind

unbindService时

04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onUnbind
04-25 22:20:43.565 1929-1929/com.isdust.zor.view_learn D/FirstService: onDestroy

可以看到,依次调用了onUnbind和onDestroy


https://www.jiucaihua.cn/news/show-2648053.html

相关文章

郁金香搜索引擎的方案(2017版)

先介绍学心理学的时候记住的两个把妹秘籍:1>巴甫洛夫把妹法:巴甫洛夫的狗的反射试验上学的时候大家都应该学过,天天给狗喂食的时候摇铃,后来不喂食只摇铃狗还是分泌唾液。应用到把妹这个非常有实际意义的事情上面就是:每天给妹子送早晨&am…

Elasticsearch的基本概念和指标

背景在13年的时候,我开始负责整个公司的搜索引擎。嗯……,不是很牛的那种大项目负责人。而是整个搜索就我一个人做。哈哈。后来跳槽之后,所经历的团队都用Elasticsearch,基本上和缓存一样,是项目必备的工具。目前静儿在…

实现一个自己的搜索引擎的初始规划(2017版)

在想自己和刚毕业的时候处理问题有什么不同。刚毕业的时候如果想卸载停用什么东西提示说正在使用,我就去找个强力卸载软件。如果我想清理浏览器缓存,会直接用工具,如果想找到缓存路径选择性的清理,会百度一下这个浏览器的默认缓存…

mvn 命令

2019独角兽企业重金招聘Python工程师标准>>> mvn clean install -Dmaven.test.skip [INFO] ------------------------------------------------------------------------ [INFO] Building demo-base 1.0.0-SNAPSHOT [INFO] ---------------------------------------…

SOFA 源码分析 — 链路数据透传

前言 SOFA—RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据。 使用方式如下,可分别向链路的 request 和 response 中放入数据进行透传,并…

使用Elasticsearch的动态索引和索引优化

关于映射实际工作中使用过ES的朋友可能会有和静儿一样的感受。ES存储更新从编码上是很方便。如下,Kubernetes的yaml文件完全可以通过json直接序列化一下,一行代码存入ES。剩下的工作可以交给ES进行动态生成映射。索引映射的生成方式有两种:动…

程序媛是怎样找老公的(2017版)

今天和老公聊QQ说到最近去哪里玩,他立即回了一个:厦门。为了这个回复,我哭了一个下午,感动的。厦门我们是去过的,11年的时候当时他在厦门出差做一个项目,项目遇到性能问题。到十一了,我要去厦门…

程序媛的人生观

昨天的上班经历昨天是周四,周四是发版日。因为周五有其他的会,我们组决定周四辛苦一点,开会将项目验收和两个技术方案评审都做了。验收项验收的是我晚上要发版的系统。白天的时候不堪忍受之前一直沿用的jackson文本方式进行MQ传输的低效和对嵌…

编写代码的「八荣八耻」(上篇)

产品命名:以简单有趣为荣,以冗长难记为耻。静儿从19年元旦以来,新创建的4个产品:heimdal、carter、hydra、stark。分别对应漫威里的:海姆达尔(Heimdallr是彩虹桥的守护神,我们项目用的是heimdal…

python socket网络编程

Python提供了两个基本的socket模块: 第一个是Socket,它提供了标准的BSD Sockets API。 第二个是SocketServer,它提供了服务器中心类,可以简化网络服务器的开发。 下面讲的是Socket模块功能 1、Socket类型 套接字格式: …