Service,一个可以在后台长时间运行而不提供用户界面的应用组件
1.启动方式和生命周期
1.1 startService
startService使用的是同一个Service,onCreate()会执行一次,onStart()和onStartCommand()会执行多次,startService启动时是单独开一个服务,与启动对象没有任何关系
1.2 bindService
onCreate()和onBind()只会调用一次,bindService启动时会于启动对象绑定,当启动对象销毁时,Service也会随之销毁
下面是Android官网给出的两种启动方式执行流程图
2.IntentService
2.1简介
IntentService是Service的子类,通过开启一个线程HandlerThread处理所有请求,任务执行完后自动停止服务
2.2原理
创建一个名叫ServiceHandler的内部handler
把内部handler与HandlerThread对应的子线程进行绑定
HandlerThread开启线程,创建自己的looper
通过onStartCommand()的实现,将Intent依次发送到工作队列和onHandleIntent()
2.3与Service的区别
IntentService会创建独立的worker线程来处理所有的Intent请求,所有请求处理完后,无需调用任何方法即可自动停止,IntentService不会阻塞UI线程
Service主线程不能处理耗时操作,需要调用stopSelf()停止,普通的Service会导致ANR异常
3.Service与Thread
3.1Thread
Thread是程序的最小单元,在android系统中,线程一般指的是工作线程,即后台线程。主线程是一种特殊的工作线程,为了保证UI的响应能力主线程不可执行耗时操作。耗时操作应该在工作线程(子线程)执行
3.2Service
Service是一种轻量级的IPC通信,运行在主线程上,由系统进程托管。如果需要长时间在后台运行,并且不需要交互的情况下可以使用服务
3.3两者结合使用
在大部分情况下,两者都会结合使用,比如文件下载。通过Service在后台执行,Notification在通知栏显示,Thread异步下载。
4.如何保证服务不被杀死
4.1因内存资源不足而杀死
将onStartCommand() 方法的返回值设为 START_STICKY或START_REDELIVER_INTENT,在内存不足时杀死后,在资源足够时再恢复。或者将Service设置为前台服务,提高优先级在内存资源不足时也不会被杀死
4.2用户通过 settings --> Apps --> Running --> Stop 方式杀死
这种情况会执行Service的生命周期,所以可以在onDestroy()中发送广播重新启动
4.3用户通过 settings --> Apps --> Downloaded --> Force Stop 方式强制杀死
这种情况不会执行Service的生命周期,所以无法重启服务