开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详
- 服务简介
服务是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。
2.服务的创建
(1)创建Service子类
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
}
(2)在清单文件中配置
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
3.服务的启动方式
(1)通过startService()方法启动
当通过startService()方法启动服务时,需要自身调用stopSelf()方法或者其他组件调用stopService()方法时服务才能停止。
(2)通过bindService()方法启动
当使用bingService()方法启动服务时,需要调用unbindService()方法解除绑定之后就会被销毁。
(3)即调用startService()方法,又调用了bingService()方法
这种情况下,要同时调用stopService()和unbindService()方法。
4.Service的生命周期
- onCreate():第一次创建服务时执行的方法。
- onDestory():服务被销毁时执行的方法。
- onStartCommand():访问者通过startService(intent)启动,服务时执行的方法。
- onBind():使用bindService()方式启动服务调用的方法。
- onUnbind():解除绑定时调用的方法。
5.Activity和Service进行通信
Activity和Service之间的通信由IBinder负责,在Activity中,创建一个类实现ServiceConnection接口,并且在这个类中重写onServiceConnected方法(当Service被绑定时会回调这个方法)和onServiceDisconnected方法(Service的创建进程崩溃或者被杀掉才会调用),然后再绑定Service。
lateinit var myBinder:MyService.mBinder
private val connection=object :ServiceConnection{
override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
myBinder=p1 as MyService.mBinder
myBinder.a()
}
override fun onServiceDisconnected(p0: ComponentName?) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bindbutton:Button=findViewById(R.id.bindbutton)
val unbindbutton:Button=findViewById(R.id.unbindbutton)
bindbutton.setOnClickListener {
val intent=Intent(this,MyService::class.java)
bindService(intent,connection,Context.BIND_AUTO_CREATE)//绑定Service
}
unbindbutton.setOnClickListener {
unbindService(connection)//解绑Service
}
}
}
在Service中,需要创建一个类继承Binder,在onBind()方法中返回这个类的实例。
private val myBinder=mBinder()
class mBinder:Binder(){
fun a(){
Log.d("data","service")
}
}
override fun onBind(intent: Intent): IBinder {
return myBinder
}
override fun onCreate() {
super.onCreate()
Log.d("data","onCreate")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("data","onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d("data","onDestroy")
}
}