博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 编程下的四大组件之服务(Service)
阅读量:6716 次
发布时间:2019-06-25

本文共 2144 字,大约阅读时间需要 7 分钟。

服务(Service) 是一种在后台运行,没有界面的组件,由其他组件调用开始。Android 中的服务和 Windows 中的服务是类似的东西,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。

服务(Service)的实现

1. 定义类继承 Service,重写 onCreate()、 onStart(Intent intent, int startId)、 onBind(Intent intent)、 onUnbind(Intent intent)、onDestroy() 中需要的方法。

2. 在清单文件的 <application> 节点下声明 <service>。

服务不能自己运行,需要通过调 用 Context.startService() 或 Context.bindService() 方法启动服务。这两个方法都可以启动 Service,但是它们的使用场合有所不同。使用 startService() 方法启用服务,访问者与服务之间没有关联,即使访问者退出了,服务仍然运行。使用 bindService() 方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止。采用 Context.startService() 方法启动服务,只能调用 Context.stopService() 方法结束服务,服务结束时会调用 onDestroy() 方法。【注意:服务的生命周期方法都是在主线程执行,所以不能直接在服务里面做耗时操作做,如果需要做耗时操作,应该在服务里面开启子线程。】

通过 startService() 和 stopService( ) 启动和关闭服务。适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要使用 bindService() 和 unbindService() 方法绑定和解绑服务。

采用 Context.bindService() 方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate() 方法,接着调用 onBind() 方法,这个时候访问者和服务绑定在一起。 如果访问者要与服务进行通信,那么,onBind() 方法必须返回 Ibinder 对象。如果访问者退出了,系统就会先调用服务的 onUnbind() 方法,接着调用 onDestroy() 方法。如果调用 bindService() 方法前服务已经被绑定,多次调用 bindService() 方法并不会导致多次创建服务及绑定(也就是 说 onCreate() 和 onBind() 方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用 unbindService() 方法,调用该方法也会导致系统调用服务的 onUnbind() → onDestroy() 方法。

服务(Service)的生命周期(服务的生命周期与启动服务的方法有关)

  • 当采用 Context.startService() 方法启动服务,生命周期如下:

onCreate() → onStart() → onDestroy()

onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次 startService() 或 bindService() 方法,服务也只被创建一次。onStart() 只有采用 Context.startService() 方法启动服务时才会回调该方法,该方法在服务开始运行时被调用。多次调用 startService() 方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。onDestroy() 该方法在服务被终止时调用。

  • 当采用 Context.bindService() 方法绑定服务,生命周期如下:

onCreate() onBind() onUnbind() onDestroy()

onBind() 只有采用 Context.bindService() 方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用 Context.bindService() 方法并不会导致该方法被多次调用。onUnbind() 只有采用 Context.bindService() 方法绑定服务后解绑服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

  • 如果先采用 startService() 方法启动服务,然后调用 bindService() 方法绑定到服务,再调用 unbindService() 方法解除绑定,最后调用 bindService() 方法再次绑定到服务,生命周期如下:

onCreate() → onStart() → onBind() → onUnbind()[重载后的方法需返回true] → onRebind()

转载地址:http://bckmo.baihongyu.com/

你可能感兴趣的文章
学生管理系统实例
查看>>
「造个轮子」——cicada(轻量级 WEB 框架)
查看>>
2-AIV--使用ContentProvider查询联系人
查看>>
1137. Final Grading (25)
查看>>
算法与数据结构(十) 总结
查看>>
这部在豆瓣和IMDb都曾得到高分的电影,让我震撼......
查看>>
Json解析框架之Gson详解
查看>>
支持生产阻塞的线程池
查看>>
[Hadoop]Reducer总是能复用为Combiner?
查看>>
自动化与机器人
查看>>
ESP8266 OTA之浏览器更新
查看>>
专访光鉴科技CEO朱力:打破苹果垄断,自研芯片打造低成本3D视觉解决方案
查看>>
docker的下载
查看>>
redis几种数据导出导入方式
查看>>
中间件万里行?不远万里来相会?| 阿里中间件Aliware 开启全国赋能之旅
查看>>
对抗思想与强化学习的碰撞-SeqGAN模型原理和代码解析
查看>>
多Git账户的Git使用
查看>>
iOS脚本自动编译静态包/静态库
查看>>
并发安全的 ConcurrentHashMap 实现原理详解
查看>>
【MySQL疑难杂症】如何将树形结构存储在数据库中(方案三 Closure Table)
查看>>