美文网首页
Kotlin实现绑定服务并调用服务中方法

Kotlin实现绑定服务并调用服务中方法

作者: 妖苔 | 来源:发表于2018-04-23 14:51 被阅读109次

为了方便将所有的类和方法都放在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暴露出来的部分方法
源码较为简单就不贴出来了

相关文章

网友评论

      本文标题:Kotlin实现绑定服务并调用服务中方法

      本文链接:https://www.haomeiwen.com/subject/ohcllftx.html