为了方便将所有的类和方法都放在Activity中以内部类的方式展现
自定义Server
//internal 是Kotlin中的修饰符表示同一模块中任何地方可见,inner表示为内部类
internal inner class MyServer : Service() {
override fun onBind(p0: Intent?): IBinder {
return MyBinder()
}
fun methodOneInServer() {//Activity中无法调用
Toast.makeText(applicationContext, "服务里的方法执行了。。。", Toast.LENGTH_SHORT).show()
}
fun methodInServer() {
Toast.makeText(MainActivity@ this, "服务中的方法", Toast.LENGTH_SHORT).show()
}
//服务中的Binder对象,实现自定义接口IMyBinder,决定暴露那些方法给绑定该服务的Activity
internal inner class MyBinder : Binder(), IMyBinder {//注意实现接口的方式
override fun invokeMethodInMyServer() {
methodInServer()//暴露给Activity的方法
}
}
}
自定义接口
internal interface IMyBinder {
fun invokeMethodInMyServer()
}
Activity中绑定
class MainActivity : AppCompatActivity() {
internal lateinit var myBinder: IMyBinder
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//上下文,和.class文件的写法
val serverIntent = Intent(MainActivity@ this, Service::class.java)
val myConnection = MyConnection()
bindService(serverIntent, myConnection, Context.BIND_AUTO_CREATE)
myBinder.invokeMethodInMyServer()
}
//自定义ServiceConnection
internal inner class MyConnection : ServiceConnection {
override fun onServiceDisconnected(p0: ComponentName?) {
}
override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
myBinder = p1 as IMyBinder//对象的强制转换
}
}
}
应为绑定服务之后会获得一个Binder对象,该对象由ServiceConnection返回,由Server中onBind方法创建,该自定义Binder实现一个自定义接口,在自定义Binder对象实现该接口的方法的时候与Service中的方法关联起来,从而可以从绑定Server的Activity中调用Server暴露出来的部分方法
源码较为简单就不贴出来了
网友评论