Service是什么?
- Service是Android四大组件之一,Service是长期运行在后台的应用程序组件。
- Service不是进程,也不是线程,它和应用程序在同一个进程中,它更像是一个没有UI的Activity
- Service运行在主线程中,不能做耗时操作
IntentService是什么?
- IntentService继承于Service,启动方式和Service一样
- 优势:
- 带有一个工作线程来处理耗时操作,在onHandleIntent中进行耗时操作,可以启动IntentService多次,每一个耗时任务都会以队列的方式在onHandleIntent回调方法中执行,每次执行一个
- 当任务完成后(onHandleIntent执行完)自动退出,无需手动停止Service
- 工作流程:
查看IntentService源码发现,在onStartCommand中调用了onStart()方法,在onStart中向子线程的Handler发送了一个消息,在handleMessage中执行了onHandleIntent的抽象方法,由我们继承的子类完成具体内容,最后调用了stopSelf来关闭当前Service - 可以使用Service+协程,实现类似IntentService的操作,来解决Service中需要执行的耗时操作
- 不推荐单独使用bindService启动IntentService是因为不会执行onHandleIntent方法
- Android 8.0以上不推荐使用IntentService了,Google推荐使用JobIntentService
Service应用场景
- 后台播放音乐,定位服务,每隔一定时间和服务器进行交互等
Service两种启动方式,和生命周期
-
startService
- 启动一个服务,不与组件进行通信,停止服务使用stopService,生命周期独立,一旦启动可以在后台无限期运行下去,即使当启动它的组件已销毁
- Service在系统中被启动多次,系统只会创建一个该Service实例,onCreate只会执行一次,onStartCommand方法调用次数和启动次数一致
-
bindService
- 启动并绑定服务,绑定服务后,Activity可以和服务进行交互,Activity销毁后,服务解绑
- 绑定Service内部会调用onCreate、onBind
- 不会走onStartCommand方法
startService和bindService结合使用
- 使用场景
使用startService启动一个服务后,需要和服务通信,使服务绑定到Activity - 若要停止服务(无论是先启动,还是先绑定)
既需要解绑(或者activity销毁自动解绑),也需要停止
startService和bindService结合使用日志
- 启动服务,绑定服务,解绑服务,停止服务
(解绑服务后,没有销毁,需要点击停止服务)
E/MyService: onCreate:
E/MyService: onStartCommand:
E/MyService: onServiceConnected:
//点击解绑后出现
E/MyService: onUnbind:
//点击停止后出现
E/MyService: onDestroy:
- 绑定服务,启动服务,停止服务,解绑服务
(停止服务后,并没有停止,需要在解绑一下)
E/MyService: onCreate:
E/MyService: onServiceConnected:
E/MyService: onStartCommand:
//点击解绑后出现onUnbind,onDestroy
E/MyService: onUnbind:
E/MyService: onDestroy: