外观
startService 和 bindService 有什么区别?
标准回答
startService 让服务进入“已启动”状态;bindService 建立客户端与服务的连接,通过返回的 Binder 调用能力。二者可以同时存在。
关键机制
- 首次启动常见顺序:onCreate → onStartCommand。再次 start 通常只触发 onStartCommand;需要 stopSelf / stopService 结束已启动状态。
- 纯绑定服务首次绑定通常 onCreate → onBind,最后一个绑定解除后可销毁。ServiceConnection 的连接结果是异步到达的。
- 长期用户可感知任务可能使用前台服务;可延迟且要求可靠执行的工作常用 WorkManager。是否允许启动取决于系统版本、targetSdk 和任务类型。
通俗例子
播放音乐可以让服务保持已启动状态,再由页面 bind 过去调用暂停和查询进度。页面退出解除绑定,不代表播放一定停止。
易混淆点
同进程绑定也能使用 Binder;bindService 并不自动意味着跨进程。前台服务仍受限制,也不是永生进程。
参考资料
补充解释与边界
startService 建立启动状态,适合独立于某次绑定而持续执行的工作;bindService 让客户端获得服务接口并建立绑定关系,适合交互式调用。只有绑定状态的服务在最后一个客户端解绑后通常会被销毁;同时被启动的服务,还需要结束启动状态。(绑定服务)
首次启动一般是 onCreate → onStartCommand,多次启动可多次调用 onStartCommand。首次绑定一般是 onCreate → onBind,解绑涉及 onUnbind。两种使用方式可以组合,生命周期要一起判断。bindService 不等于跨进程,跨进程时才涉及相应 IPC。
长时间设备连接用什么?看业务是否需要用户可感知的持续任务,再考虑符合限制的前台服务或伴生设备能力。普通 Service 不保证进程常驻;前台服务也要满足启动条件、类型和权限要求。(前台服务类型要求)
内容来源
- Android 技术札记 · 原条目
service - Android 智能硬件 SDK 技术 Wiki · 原条目
Q05