记一次安卓(Kotlin)-Android四大组件之Service_15

448 阅读2分钟

是Android提供的一种不需要和用户交互,且需要长期运行任务的解决方案.Service启动后默认是运行在主线程中,在执行具体耗时任务过程中要手动开启子线程,应用程序进程被杀死,所有依赖该进程的Service服务也会停止运行.

Sefvice是四大组件之一,同样需要在AndroidManifest中注册后,才能使用

  • 创建Service
  • Service的两种启动方式
  • Service生命周期
  • Activity与Service交互
  • Andorid8.0关于Service改动

Service启动方式为两种,普通启动StartService,绑定启动bindService

image.png

对于使用startService的方式而言,onStartCommand就是我们用于做后台任务的地方; 如果多次调用startService,会直接回调onStartCommand,而不再回调onCreate; 这种启动的服务,它的生命周期跟应用程序的生命周期一样长,只要应用程序不被杀死,服务就会一直运行着除非我们调用stopService. startService一半来说是用于创建一个长时间持续运行的后台任务的时候才会使用,比如socket,文件上传下载服务

使用BindService绑定Service,依次调用onCreate(),onBind()方法,我们可以在onBind()方法中返回自定义的IBinder对象;再接着调用的是ServiceConnection的onServiceConnected()方法;该方法中可以获得IBinder对象,从而进行相关操作;当Service解除绑定后会自动调用,onUnbind和onDestroyed方法,当然绑定多客户端情况要解除所有的绑定才会调用onDestoryed方法进行销毁,bindService是运行一些和Activity生命周期相等的后台任务,比如说夸进程的通信,就用这个

Android 8.0及以上不允许后台启动Service服务

Android 8.0

  • 如果针对Andorid8.0的应用尝试在不允许其创建后台服务的情况下用startService()函数,则该函数将引发一个IllegalStateException.
  • 新的Context.startForegroundService()函数将启动一个前台服务.现在,即使应用在后台运行,系统也允许其调用Context.startForegroundService().不过,应用必须在创建服务后的5s内调用该服务的startForeground()函数

image.png

image.png