最近给app添加计步的功能,开一个service,然后用ipc进程间通信,重新复习了一下android四大组件之一的service;

先来看service的生命周期:

service的生命周期,从它被创建开始,到它被销毁,可以有两条不同的路径:
A started service
被开启的service通过其他组件调用startService()被创建
这种service可以无限地运行下去,必须调用stopSelf()方法或者其他组件调用stopService()方法来停止它.
当service被停止时,系统会销毁它。

A bound service
被绑定的service是当其他组件调用bindService()来创建的。
客户可以通过IBinder接口和service进行通信。
客户可以通过unbindService()方法来关闭连接。
一个service可以同时和多个客户绑定,当多个客户都解除绑定后,系统会销毁service。

当然,可以同时调用startService和bindService开启和绑定service

onCreate()
不管你是开启还是绑定服务,最开始的回调函数肯定是onCreate(),并且该回调只会执行一次,之后再执行开启或绑定服务都不会走该回调函数,除非你的service被销毁了。

onStartCommond()
每次执行startService()都会调用一次onStartCommond()。

onDestory()
service被销毁时,回调该函数

我觉得重要的还是bindService()那几个回调函数onBind(),onUnbind(),onRebind()。

看个栗子,估计大家就明白了:
一般我们在启动service都会同时调用startService和bindService,
startService之后,如果没有调用stopStervice,服务会一直在后台,除非被系统杀死,bindService是将组件和服务绑定起来,可以通过unBindService来解绑。首先在activity中我们调用了startService和bindService()后,会回调onBind()方法,

    @Overridepublic IBinder onBind(Intent intent) {Log.e("bindService", "onBind");return mBinder;}

在activity的onDestory()方法里我们调用

    @Overridepublic void onDestroy() {super.onDestroy();if (isBind) { //如果绑定了unbindService(conn); //解绑}}

onUnbind回调

    @Overridepublic boolean onUnbind(Intent intent) {Log.e("bindService", "onUnbind");return super.onUnbind(intent);}


可以看到,先绑定了,之后activity销毁后,又解绑了。

然后我再打开该activity,再次执行bindService,onBind()方法并不会执行,因为我们的service通过startService已经在后台开启了,这时候再次bindServce是不会调用onBind()方法的,除非你把服务都杀掉后,才后重新走onBind方法,服务一直在后台,对应的onBind只会走一次,那么之后如果调用bindService()之后,其实走的都是onRebind()方法,当然前提是在onUnbind()的返回一定要为true
如下:

    @Overridepublic boolean onUnbind(Intent intent) {Log.e("bindService", "onUnbind");return true;}

改完之后,


可以看到,只要service没没被杀死,不管你进来几次,都是回调onRebind和onUnbind方法,并且如果你只是bindService,并没有stopService也是一样的。

因为自己正好用到了service,所以对service的生命周期又重新学习了一遍,当你对service的生命周期走向不了解的时候,建议你每一个回调方法里面都打日志,这样就很清楚了。
当时我遇到的问题是,在app打开时,点开service的前台notification,跳转到相应的计步页面,在app关闭时,点开service的前台notification,先启动app,在跳转到相应的计步页面,这个时候,其实只要在service的这几个生命周期里面加一个全局变量,判断当前app是否启动,然后在notification中进行判断就好了,回调了onUnBind,则说明app关闭了,可以在回调onUnbind的时候设置一个变量记录如isBind = false,回调了onBind或者onRebind说明app重启了,可以记录为isBind = true,这样在notification中就可以通过isBind的值来启动app还是直接跳转相应界面了。

虽然很早就了解生命周期,还是在实际运用中才能加深印象,并巩固。

onBind,onRebind,onUnbind相关推荐

  1. Android开发者指南(4) —— Application Fundamentals

    前言 本章内容为开发者指南(Dev Guide)/Framework Topics/Application Fundamentals,版本为Android2.3 r1,翻译转载并整理自译言:" ...

  2. 【Android】Service几个重要的方法运行在哪个线程

    一.前言 Service是Android中的四大组件之一,在开发中也是经常使用的. Service的用法比较简单,这里不过多进行讨论.但是,我们用了这么久的Service,是否有想过以下问题: Ser ...

  3. Android开发之旅:组件生命周期(二)

    引言 应用程序组件有一个生命周期--一开始Android实例化他们响应意图,直到结束实例被销毁.在这期间,他们有时候处于激活状态,有时候处于非激活状态:对于活动,对用户有时候可见,有时候不可见.组件生 ...

  4. 深入理解Android的startservice和bindservice

    一.首先,让我们确认下什么是service?          service就是android系统中的服务,它有这么几个特点:它无法与用户直接进行交互.它必须由用户或者其他程序显式的启动.它的优先级 ...

  5. Android开发者指南(4) —— Application Fundamentals(二)

    线程安全方法(Thread-safe methods) 在一些情况下,你所实现的方法有可能会被多于一个的线程所调用,所以它们必须被写成线程安全的. 对于我们上一节所讨论的RPC机制中的可以被远程调用的 ...

  6. Application Fundamentals

    Application Fundamentals 署名:译言biAji 链接:http://developer.android.com/guide/topics/fundamentals.html 应 ...

  7. [转] Bound Service的三种方式(Binder、 Messenger、 AIDL)

    首先要明白需要的情景,然后对三种方式进行选择: (一)可以接收Service的信息(获取Service中的方法),但不可以给Service发送信息 (二) 使用Messenger既可以接受Servic ...

  8. Service与Android系统实现(1)-- 应用程序里的Service

    原址:http://blog.csdn.net/21cnbao/article/details/8086487 特别声明:本系列文章作者系吴赫.分多次连载,讲述Android Service(Java ...

  9. Android开发基础入门

    Android基础 一 什么是android android是专为移动设备定制的包括操作系统,中间件,和核心应用程序的软件集.Android SDK提供了用Java语言开发android应用程序所需要 ...

最新文章

  1. CUDA学习-函数前缀__global__
  2. 微信公众平台开发:进阶篇(Web App开发入门)
  3. 《你不知道的Javascript--中卷 学习总结》(类型、值)
  4. ⾼维特征的哈希技巧总结
  5. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
  6. 自绘列表框控件显示略缩图----再稍微改进点点。。
  7. docker server 容器连接sql_docker 容器连接 host的sql server失败
  8. [开发笔记]-获取歌曲ID3信息
  9. 小码农也有大梦想!最小公倍数java算法
  10. 字符串匹配——C++使用Regex
  11. sklearn做文本聚类分析
  12. mock server java_mock server搭建及接口测试简单实例
  13. 在企业中采用知识管理工具的好处
  14. scala 2.13 并行集合par 的引用
  15. 前端历程(一)------初识前端
  16. 关于vs中出现lnk2019和lnk1120错误
  17. 一份OA的数据库设计
  18. 我的世界如何增加小游戏服务器,我的世界服务器小游戏怎么玩 骨灰玩家手把手教学...
  19. 2022,又一批AI大牛从大厂出走了
  20. sdkman 管理开发中使用的sdk

热门文章

  1. 2022年全球与中国麦克风会议系统市场现状及未来发展趋势
  2. Python游戏开发-03-用font对象把日志显示到屏幕上
  3. 如何在没有iTunes的情况下备份和还原iPhone或iPad
  4. 阿里巴巴参谋长曾鸣全面深入阐释:何谓互联网的本质?
  5. Python数据分析豆瓣电影Top250
  6. 2018rust炸服_炉石传说:炸服娱乐卡组堕落法,让你对手看一个小时的过场动画!...
  7. 利用图像识别技术获取安卓手机游戏的坐标
  8. 2019年繁星屠龙1-8窍门_新版《倚天屠龙记》遭惨骂?导演微博回复:不会再翻拍,受伤了...
  9. Linux 学习之旅
  10. 立创商城 元件封装,ALtium 3D图