Android - 如何将函数传递给 Activity?

Android - How to pass a function to an Activity?

我正在尝试为 activity 创建一个生成器。原因是因为这个 activity 可以通过多种不同的方式启动。我像这样创建了一个生成器 class:

class ActivityBuilder {

    private var showToolBar = false
    private var postExecutable: (() -> Unit)? = null

    fun showToolbar(boolean: Boolean) : ActivityBuilder {
        this.showToolBar = boolean
        return this
    }

    fun setPostExecutable(function: () -> Unit) : ActivityBuilder {
        this.postExecute = function
        return this
    }

    fun start(context: Context){
        val intent = Intent(context, Activity::class.java)
        context.startActivity(intent)
    }
}

我们的想法是调用类似这样的东西并访问 activity 中的这些字段。

 ActivityBuilder().showToolbar(false).setPostExecutable { { doSomething() } }.start(this)

我想我也可以使用一个伴生对象,它可以达到同样的目的。

companion object Builder {

    private var showToolBar = false
    private var postExecute: (() -> Unit)? = null

    fun showToolbar(boolean: Boolean) : Builder {
        this.showToolBar = boolean
        return this
    }

    fun setPostExecutable(function: () -> Unit) : Builder {
        this.postExecute = function
        return this
    }

    fun start(context: Context){
        val intent = Intent(context, AuthActivity::class.java)
        context.startActivity(intent)
    }
}

问题主要来自 "postExecutable" 字段。我需要在某个点调用该函数,但它不可打包,所以我无法在启动时通过意图传递它 activity.

如果有人有解决方案,我不胜感激!

这是我找到的一个解决方案,可能不是最优雅的。我使用父上下文创建了一个广播接收器,它与我的 activity 同时启动。

class ActivityBuilder(private val context: Context) {

    private var postSuccessExecutable: (() -> Unit)? = null
    ...
    private fun setupReceiver(){

        val filter = IntentFilter()
        filter.addAction("SUCCESS")

        val receiver = object : BroadcastReceiver() {
            override fun onReceive(c: Context?, intent: Intent?) {

                context.unregisterReceiver(this)

                if (intent?.action == "SUCCESS"){
                    Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show()
                    postSuccessExecutable?.invoke()
                }
            }
        }

        context.registerReceiver(authReceiver, filter)
    }
    ...
}

当我要触发该功能时,我只是发送一个广播:

private fun sendSuccessBroadcast(data: String){
    val intent = Intent()
    intent.action = "SUCCESS"
    intent.putExtra("data", String)
    requireContext().sendBroadcast(intent)
}