这种通过接口将数据从 Activity 传递到 Fragment 的方法在幕后如何工作?

How does this method of passing data from Activity to Fragment via interface work under the hood?

我正在使用此接口将一些数据从我的 Activity 传递到我的 DialogFragment,我想更好地理解为什么这样做。似乎 activity 订阅了接口并实现了其中定义的方法,将字符串返回给接口。然后 DialogFragment 声明接口的一个实例,并从 Activity 中获取存储在那里的数据。我的理解是否正确,或者是否有更好或更完整的方式来描述正在发生的事情?

这是我的代码:

interface ResultReceiver {

    fun getSerialNumber(): String

    fun getDevicePassword(): String

    fun getMacAddress(): String

    fun getDevice(): BluetoothDevice
}

我正在订阅我的 activity 中的界面并像这样设置数据:

class ScannerActivity: AppCompatActivity(), ResultReceiver {

    private lateinit var serialNumber: String
    private lateinit var devicePassword: String    
    private lateinit var device: BluetoothDevice
    private lateinit var macAddress: String


    ...


    override fun getSerialNumber(): String {
        return serialNumber
    }

    override fun getDevicePassword(): String {
        return devicePassword
    }

    override fun getMacAddress(): String {
        return macAddress
    }

    override fun getDevice(): BluetoothDevice {
        return device
    }
}

这就是我将其放入 DialogFragment 的方式:

private lateinit var resultReceiver: ResultReceiver

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog  {

        resultReceiver = requireContext() as ResultReceiver

        val devicePassword = resultReceiver.getDevicePassword()

        val serialNumber = resultReceiver.getSerialNumber()

        val macAddress = resultReceiver.getMacAddress()


        ...


}

片段最终与 Context 关联,这通常是 Activity ,但不一定是 。当您调用 requireContext() as ResultReceiver 时,您 a) 假设您有一个上下文,并且 b) 它实现了 ResultReceiver 接口

由于您的片段托管在 ScannerActivity 中,这就是您的 Context。并且因为它实现了 ResultReceiver,您可以将其转换为一个,并使用该界面中的所有功能 - getDevicePassword() 等。您也可以在其他活动中显示该对话框,只要它们也实现 ResultReceiver。它不依赖于任何一种父类型 activity,只是实现该接口的东西

所以你只是直接与你的 activity 对话,通过它作为 ResultReceiver 所需的方法,仅此而已!