**Service服务:**不需要和用户交互,且需要长期运行任务的解决方案。负责后台任务,比如播放音乐,socket长连接
Service启动后默认是运行在主线程中,在执行具体耗时任务过程中要手动开启子线程,应用程序进程被杀死,所有依赖该进程的Service服务也会停止运行。
图片和部分文字转载于https://www.songyubao.com/book/primary/activity/service.html
1.Service启动方式与生命周期
Service启动方式分为两种,普通启动startService 、绑定启动bindService
1.1 普通启动startService()
一般用于创建一个长时间持续运行的后台任务的时候才会使用,比如说socket,文件上传下载服务
普通启动startService(),它的生命周期和应用程序的生命周期一样长,只要应用程序不被杀死,服务就会一直运行 ,除非我们使用stopService()
①首次启动会创建一个Service实例,依次调用onCreate()和onStartCommand()方法,此时Service 进入运行状态
②如果再次调用StartService启动Service,将不会再创建新的Service对象, 系统会直接复用前面创建的Service对象,调用它的onStartCommand()方法!
③这样的Service与它的调用者无必然的联系,就是说当调用者结束了自己的生命周期, 但是只要不调用stopService,那么Service还是会继续运行的!
④无论启动了多少次Service,只需调用一次StopService即可停掉Service
定义Service服务
class TestService1 : Service(){
private var TAG = "TestService1"
override fun onCreate() {
super.onCreate()
Log.e(TAG,"onCreate")
}
override fun onBind(p0: Intent?): IBinder? {
Log.e(TAG,"onBind")
return null
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.e(TAG,"onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
Log.e(TAG,"onDestroy")
super.onDestroy()
}
}
AndroidManifest.xml完成Service注册
<application>
<service android:name=".TestService1"/>
</application>
在Avtivity中StartService启动服务 (要在AndroidManifest注册)
private lateinit var binding : ActivityTestServiceBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityTestServiceBinding.inflate(layoutInflater)
setContentView(binding.root)
//启动服务
binding.startService.setOnClickListener {
val intent = Intent(this , TestService1::class.java)
startService(intent)
}
//停止服务
binding.stopService.setOnClickListener {
val intent = Intent(