网站首页 > 教程文章 正文
前篇我们已经介绍了Activity以及其生命周期,我想大家已经有所了解了。今天我们就来讲讲四大组件中的Service。
Service作为Android中四大组件之一,拥有重要的地位。Service具有和Activity一样的级别,Service跟Activity的区别就是Service没有界面,是运行于后台的服务。这个运行“后台”是指不可见,不是指在后台线程中。事实上四大组件都是运行在UI线程中,都不能在各自的生命周期方法中执行耗时操作或者网络请求。 Service的应用场景还是比较多的,比如说在后台播放音乐、实时去更新当前地理位置的变化、新闻APP后台去离线缓存内容、进程间通信等。
Service主要可以分为两类:Local Service、Remote Service。比较常用的还是Local Service,应用于程序内部。可以通过startService()启动Service,通过stopService()结束服务。无论调用多少次startService(),只需一句stopService()就终结服务了。startService()和stopService()适用于服务和访问者之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要使用 bindService() 和 unbindService() 方法绑定和解绑服务。采用 bindService() 方法启动服务,在服务未被创建时,系统会先调用服务的 onCreate() 方法,接着调用 onBind() 方法,这个时候访问者和服务绑定在一起。 如果访问者要与服务进行通信,那么,onBind() 方法必须返回 Ibinder 对象。如果访问者退出了,系统就会先调用服务的 onUnbind() 方法,接着调用 onDestroy() 方法。如果调用 bindService() 方法前服务已经被绑定,多次调用 bindService() 方法并不会导致多次创建服务及绑定(也就是说 onCreate() 和 onBind() 方法并不会被多次调用)。如果访问者希望与正在绑定的服务解除绑定,可以调用 unbindService() 方法,调用该方法也会导致系统调用服务的 onUnbind() → onDestroy() 方法。
Remote Service 用于Android系统内部的应用程序之间。可以定义接口并把接口暴露出来,以便其他应用进行操作。客户端建立到服务对象的连接,并通过那个连接来调用服务。调用bindService()方法建立连接,并启动,以调用 unbindService()关闭连接。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。
下面我们就用Google官方的一张图来了解下Service的生命周期。
图1 Service的生命周期
1.当使用startService() 方法启动服务,生命周期如下:
onCreate() → onStart() → onDestroy()
onCreate() 该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次 startService() 或bindService() 方法,服务也只被创建一次。只有采用 startService() 方法启动服务时才会回调onStart()方法,该方法在服务开始运行时被调用。多次调用 startService() 方法尽管不会多次创建服务,但 onStart() 方法会被多次调用。onDestroy() 该方法在服务被终止时调用。
2.当采用 bindService() 方法绑定服务,生命周期如下:
onCreate() → onBind() → onUnbind() → onDestroy()
onBind() 只有采用 bindService() 方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用 bindService() 方法并不会导致该方法被多次调用。只有采用bindService() 方法绑定服务后解绑服务时才会回调onUnbind() 方法。该方法在调用者与服务解除绑定时被调用。
以上就是今天的内容,下篇我们将通过实例代码来深入讲解如何使用Service。谢谢大家!
文章为我们原创,转载请保留一下信息!
微价值网(公号vjiazhi),专注移动互联网、App推广、盈利以及Android/iOS等技术基础培训。
猜你喜欢
- 2025-03-19 10款你可能不知道的Android开发辅助工具
- 2025-03-19 2021年四大流行Android手机自动化测试工具,全在这里了
- 2025-03-19 安卓16锁屏组件将回归! 更多信息展示,不用解锁即可浏览!
- 2025-03-19 如何查看Android设备中的组件和控件
- 2025-03-19 Android历史版本以及最新版本:Android 15
- 2025-03-19 「字节跳动测试开发面经」一二三面+hr面+超级多干货+复习资料
- 2025-03-19 技术分享 | 想做App测试就一定要了解的App结构
- 2025-03-19 大厂面试原来是这样,这份面试攻略你值得拥有!
- 2025-03-19 我的第一个鸿蒙app,以及所见内容(ZT)
- 2025-03-19 10款可以直接拿来用的Android UI工具
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- mybatis plus page (35)
- vue @scroll (38)
- 堆栈区别 (33)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)
- redis aof rdb 区别 (33)
- 302跳转 (33)
- http method (35)
- js array splice (33)