杨说:Service知识点总结

1,099 阅读4分钟

目录

一、Service存在的意义
二、Service生命周期
三、如何保证Service不被杀死
四、其他的Service
五、Service的启动
六、Service start bind 联合使用监听应用被手动kill

一、Service存在的意义

Service Android组件之一,用于处理非界面显示的后台任务,使用时必须在清单文件中注册。

两种启动模式
startService 无限期运行
binderService 绑定服务实现IPC

服务的分类
1、前台服务 需要显示通知
2、后台服务 Android 8.0 以后对后台服务添加了更多的限制,应使用WorkManager
3、绑定 可提供IPC交互,可多个组件通知绑定该服务,如果都解绑了服务关闭

Service启动是运行在主线程的,所以如果有阻塞的操作需要自行处理子线程任务

二、Service生命周期

startService 后Service不会自己停止,需要Service在完成服务后自己调用stopSelf或者另一个组件调用stopService
onStarCommend 返回参数的含义

START_NOT_STICKY
如果系统在 onStartCommand() 返回后终止服务,则除非有待传递的挂起 Intent,否则系统不会重建服务。这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务

START_STICKY
如果系统在 onStartCommand() 返回后终止服务,则其会重建服务并调用 onStartCommand(),但不会重新传递最后一个 Intent。相反,除非有挂起 Intent 要启动服务,否则系统会调用包含空 Intent 的 onStartCommand()。在此情况下,系统会传递这些 Intent。此常量适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)

START_REDELIVER_INTENT
如果系统在 onStartCommand() 返回后终止服务,则其会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand()。所有挂起 Intent 均依次传递。此常量适用于主动执行应立即恢复的作业(例如下载文件)的服务

三、如何保证Service不被杀死

1、onStartCommand方式中,返回START_STICKY

2、onStartCommand方式中,返回START_REDELIVER_INTENT

3、提高Service的优先级 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播;

4、在onDestroy方法里重启Service 当service走到onDestroy()时,发送一个自定义广播,当收到广播时,重新启动service

5、提升Service进程的优先级 进程优先级由高到低:前台进程 一 可视进程 一 服务进程 一 后台进程 一 空进程 可以使用startForeground将service放到前台状态,这样低内存时,被杀死的概率会低一些

6、系统广播监听Service状态

7、将APK安装到/system/app,变身为系统级应用

以上机制都不能百分百保证Service不被杀死,除非做到系统白名单,与系统同生共死

四、其他的Service

4.1 IntentService

使用ThreadHandler,内部开启一个子线程运行服务,串行执行任务,运行完后自动关闭。实现 onHandleIntent(),该方法会接收每个启动请求的 Intent,以便您执行后台工作。

4.2 系统Service

五、Service的启动

5.1 startService

startServie调用的Context里的startService,然后会通知AMS启动服务

AMS会先校验Service是否存在,如果存储创建ServiceRecord,检测服务是否启动,

Service启动直接调用scheduleServiceArgs通知App进程调用onStartCommand

Service为启动,检测应用是否启动

应用启动,调用realStartService通知App进程调用onCreate(这里会反射创建Service,关联Context),o在调用scheduleServiceArgs通知App进程调用onStartCommand

应用未启动,启动应用进程,将Service添加到pedding Service

应用进程启动后,attachApplication通知AMS,处理之前的pedding Service

5.2 bindService

binder的整体过程 应用进程调用binderService到AMS

AMS请求binder Service句柄

Service发布句柄到AMS

应用回调binder句柄

应用binder调用Service

六、Service start bind 联合使用监听应用被手动kill

应用被用户主动杀死的时候很难监听到这个动作,通过startService和bindService我们就能监听到,用户主动杀死应用进程
1、startService,启动一个Service在单独的进程中,这样应用进程被杀死了不影响我们的Service进程
2、每次启动一个Activity的时候都bindService,如果用户一次性将我们的进程杀死所有的Activity都销毁,那么会触发Service的unBind方法,但是因为之前我们使用了startService所以Service不会调用onDestroy
3、我们在unBind和onDestroy之间这段时间就可以做一些上传数据之类的操作,然后stopSelf关闭Service

参考

1、Android官方文档
2、Android篇:2019初中级Android开发社招面试解答(上)