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:

其他

  • Android Service和Activity间的通信(binder和EventBus)
  • Service+协程
  • Service+Messenger跨进程通信