服务是 Android 中的一种组件,它可以在没有自己的用户界面的情况下执行工作,例如播放音乐、同步数据或进行持续的文件传输。服务与 Activity、广播接收器和内容提供器一起,构成了 Android 中四种基本的 App 组件,并且与其他组件一样,必须在 App 的 AndroidManifest.xml 中注册。默认情况下,服务在 App 的主线程上运行,因此繁重的工作仍然必须移到后台线程。
Android 区分启动型服务和绑定型服务,启动型服务会一直执行某项任务,直到被停止,而其他组件则可以绑定到绑定型服务并与之通信。前台服务执行用户能够察觉到的工作,并且必须显示一条常驻通知。由于后台工作会影响电池续航时间和性能,Android 逐步引入了一些限制,规定 App 何时可以在后台启动服务,而对于可推迟的工作,Google 通常建议改用 WorkManager。
Android 中的服务是一种 App 组件,它可以在没有自己的用户界面的情况下执行工作,例如音乐播放、同步或文件传输。服务可以被启动以执行某项任务,也可以被希望与之通信的其他组件绑定。前台服务会显示一条常驻通知,让用户知道相关工作正在进行,而由于 Android 对后台工作的限制,可推迟的任务通常会使用 WorkManager。
More about 服务
服务是 Android App 的四种基本组件之一,另外三种是 Activity、广播接收器和内容提供器。Activity 显示一个供用户交互的屏幕,而服务则用于不需要用户界面的工作,或者在用户离开屏幕后仍必须继续进行的工作。典型的例子包括播放音乐或播客、导航、上传文件以及与服务器同步数据。
从技术上讲,服务是一个继承自 android.app.Service 的类,并通过 AndroidManifest.xml 中的 service 元素进行注册。系统通过 onCreate()、onStartCommand()、onBind() 和 onDestroy() 等方法来控制服务的生命周期。重要的是要知道,服务并不会自动在单独的线程上运行。默认情况下,它的代码在 App 的主线程上执行,因此必须将长时间运行或会造成阻塞的工作移到后台线程,例如使用 Kotlin 协程,以防止 App 失去响应。
服务可以通过不同的方式使用,每种方式适合不同的需求:
前台服务:执行用户能够察觉到的工作,例如音乐播放或正在进行的锻炼记录。前台服务必须显示一条常驻通知,而在较新的 Android 版本中,App 必须声明服务类型并拥有相关权限。
后台服务:执行用户无法直接看到的工作。自 Android 8.0 起,对于 App 在自身处于后台时何时可以启动此类服务,有着严格的限制。
绑定型服务:提供一个客户端-服务器接口,其他组件,包括其他 App 中的组件,可以绑定到该服务、发送请求并接收响应。只要至少有一个组件绑定到绑定型服务,它就会一直存在。
服务最大的优势之一,是它让 App 能够继续执行重要的工作,而不必与某个特定的屏幕绑定在一起。与此同时,使用服务也需要谨慎,因为后台工作会消耗电量、内存和数据流量。因此,Android 逐步引入了限制后台工作的规则,用户也可以查看并停止正在运行前台服务的 App。
对于许多任务,Google 建议改用 WorkManager,它是 Android Jetpack 的一部分。WorkManager 适用于必须可靠执行的工作,即使 App 已关闭或设备已重启也是如此,而且这些工作可以推迟,例如上传日志文件或定期同步。WorkManager 会考虑系统的限制,并且可以配置网络连接或充电等条件。
总之,当 App 需要执行用户期望持续进行的工作,或者其他组件需要与某个长时间运行的进程通信时,服务就是正确的选择。通过选择合适的服务类型,或者在工作可以推迟时使用 WorkManager,开发者可以构建既功能完善、又能节约设备资源的 App。
Frequently asked questions about 服务
Android 中的服务是什么?
服务是 Android 中的一种组件,它可以在没有自己的用户界面的情况下在后台执行工作。它用于在用户没有查看 App 时也需要继续进行的任务,例如播放音乐、持续导航或上传文件。
服务必须在 AndroidManifest.xml 文件中声明。重要的是要知道,默认情况下,服务在 App 的主线程上运行。因此,繁重的任务仍然必须移到后台线程或协程中。在较新的 Android 版本中,为了节省电量,对于 App 何时可以在后台运行也有严格的规则。
Android 中有哪些类型的服务?
Android 区分三种类型的服务。前台服务执行用户能够察觉到的任务,并且在运行期间必须一直显示通知。例如,它可用于音乐播放或跑步记录。
后台服务执行用户无法直接看到的工作。自 Android 8.0 起,对于 App 何时可以启动此类服务有着严格的限制,因此对于许多任务,建议改用 WorkManager。绑定型服务允许 Activity 等其他组件绑定到它并与之通信,并且只有在有组件绑定到它时才会运行。
启动型服务和绑定型服务有什么区别?
启动型服务通过 startService 或 startForegroundService 启动,并会一直运行,直到它自行停止或被停止。它通常执行某项特定任务,并且不会直接向启动它的组件返回结果。
当另一个组件通过 bindService 绑定到绑定型服务时,该服务就会启动。它提供一个接口,让组件能够调用方法并接收响应,例如由 Activity 控制音乐播放器。当不再有组件与其绑定时,它就会停止。如果一个服务既被启动又被绑定,它也可以同时属于这两种类型。
什么时候应该使用 WorkManager 而不是服务?
WorkManager 是 Google 推荐的后台工作解决方案,适用于即使 App 已关闭或设备已重启也必须可靠执行的工作。这可以是同步数据、上传日志文件或定期清理。
WorkManager 遵守系统关于电池和后台活动的规则,并且可以设置为仅在特定条件下运行,例如设备连接到 Wi-Fi 或正在充电时。当工作需要立即进行且对用户可见时,例如音乐播放或正在进行的通话,服务,尤其是前台服务,就更为适用。对于 App 打开期间的短时工作,使用协程通常就足够了。
为什么前台服务必须显示通知?
前台服务可以长时间运行,并在用户没有打开 App 时使用处理器、电池和位置数据等资源。因此,Android 要求前台服务显示一条常驻通知,让用户知道 App 正在后台工作。
这提供了透明度,并让用户能够停止该服务或打开 App。在较新的 Android 版本中,开发者还必须为服务声明类型,例如媒体播放、位置或数据同步,并拥有相关权限。从 Android 13 开始,用户还必须授予通知权限,这会影响通知的显示方式。
Android 对后台工作施加了哪些限制?
为了节省电量并保护用户的隐私,Android 逐步引入了对后台工作的限制。自 Android 8.0 起,处于后台的 App 通常不能启动普通的后台服务,而且系统会在短时间后停止这些服务。
当设备未被使用或 App 很少被使用时,低电耗模式和应用待机模式会推迟网络访问和作业。较新的版本要求为前台服务指定类型和权限,并限制何时可以从后台启动前台服务。在后台访问位置信息需要单独的权限。因此,应尽可能使用 WorkManager 来调度后台工作。
服务 for dummies
Android App 中的服务就像一位隐形的帮手,即使没有人在看 App,它也能继续工作。想想音乐 App:开始播放一首歌后,用户可以返回主屏幕去写消息,而音乐会继续播放。这就是服务在发挥作用。当 App 使用服务来做用户应该知道的事情时,手机会显示一条小通知,让人清楚地知道 App 正在工作。与此同时,Android 会确保 App 不会在后台消耗太多电量,从而让电池续航更久。