startActivityForResult被废弃的替换方法--ActivityResultContract

1,198 阅读1分钟

FirstActivity代码

class FirstActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityFirstBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivityFirstBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        init()
    }

    private fun init() {
        mBinding.button.setOnClickListener {
            launcher.launch(50)
        }
    }

    private val launcher =
        registerForActivityResult(MyContract(), object : ActivityResultCallback<User?> {
            override fun onActivityResult(result: User?) {
                result?.let {
                    mBinding.textView.text =
                        "name =${it.name} sex = ${it.sex} height = ${it.height}"
                }
            }

        })

    inner class MyContract : ActivityResultContract<Int?, User?>() {
        override fun createIntent(context: Context, input: Int?): Intent {
            return Intent(context, SecondActivity::class.java).putExtra(
                SecondActivity.FOR_RESULT,
                SecondActivity.FOR_RESULT_CODE
            )
        }

        override fun parseResult(resultCode: Int, @Nullable intent: Intent?): User? {
            return if (resultCode == SecondActivity.GET_RESULT_CODE) {
                val user = intent?.getParcelableExtra<User>(SecondActivity.GET_RESULT)
                user
            } else null
        }
    }

}

SecondActivity代码

class SecondActivity : AppCompatActivity() {

    companion object {
        const val FOR_RESULT = "for_result"
        const val FOR_RESULT_CODE = 1001
        const val GET_RESULT = "get_result"
        const val GET_RESULT_CODE = 2000

    }

    private lateinit var mBinding: ActivitySecondBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mBinding = ActivitySecondBinding.inflate(layoutInflater)
        setContentView(mBinding.root)
        init()
    }
    
    //只有点击按钮才会向firstActivity返回数据,直接finish不会返回数据
    private fun init() {
        mBinding.secondButton.setOnClickListener {
            val code = intent.getIntExtra(FOR_RESULT, 0)
            if (FOR_RESULT_CODE == code) {
                val intent = Intent()
                intent.putExtra(GET_RESULT, User("111", 1, 222))
                setResult(GET_RESULT_CODE, intent)
                finish()
            }

        }
    }

}

User代码

import android.os.Parcelable
import kotlinx.parcelize.Parcelize

@Parcelize
data class User(
    var name: String,
    var sex: Int,
    var height: Int
) : Parcelable

使用kotlin的Parcelable

id 'kotlin-parcelize'