推荐阅读Carson大佬的
一份全面 & 简洁的 Service 知识讲解攻略
1. 概念
1.1 什么是Service
Service是一种可在后台长时间执行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互。 服务分为三种类型: 前台: 前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。 后台: 后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来压缩其存储空间,则此服务通常是后台服务。 绑定: 当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。
1.2 Service的启动方式
启动方式分为两种,startService和bindService
1.3 Service的生命周期是怎么样的
官方的生命周期图
startService方式开启:
startService:onCreate()->onStartCommond() stopService: onDestory()
bindService方式开启:
bindService:onCreate()->onBind() unbindService: onUnbind()->onDestory()
2. 原理
2.1 Service可以先start再bind或者先bind再start吗
操作步骤 | 结果 | 关闭Service |
---|
先startService再bindService | onCreate->onStartCommond->onBind | 必须先unbindService再stopService,service才会关闭 | 先bindService再startService | onCreate->onBind->onStartCommond | 同上,必须先解绑unbindService再stopService,service才会关闭 |
关闭的时候看日志可以看出,如果开启的时候是bind的方式开启,那么关闭service必须先解绑service再stopservice。
2.2 多次调用bindService会怎么样
只会执行一次onBind()
2.3 Service后台常驻保活方案
1.将service的等级优先级提高,比如前台服务
2.4 Service中怎么弹dialog
dialog的显示依赖于Activiy,如果需要在service中显示,可以创建一个全局的dialog,设置dialog的window的type是system alert,
dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
user-permissions也需要增加权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|