1. 程式人生 > 其它 >startActivityForResult失效,以及registerForActivityResult使用閃退、奔潰問題

startActivityForResult失效,以及registerForActivityResult使用閃退、奔潰問題

在學第一行程式碼第三版的時候,向下一個Activity傳遞資料時,說用startActivityForResult

startActivityForResult被拋棄了,查了一下,發現要用registerForActivityResult

button1.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            val startActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
                it -> when(it.resultCode) {
                    Activity.RESULT_OK -> {
                    val return_data = it.data?.getStringExtra("data_return")
                    Log.d("FirstActivity", "return data is $return_data")
                }else -> {

                    }
                }
            }
            startActivity.launch(intent)
        }

但是一點選按鈕就出問題,程式就閃退了
顯示問題

FATAL EXCEPTION: main
java.lang.IllegalStateException: LifecycleOwner com.example.activatetest.FirstActivity@f60f224 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

但一直搜第一行,第二行和後面很多一樣導致沒看到,搜了都是差不多教怎麼使用新的registerForActivityResult
後面注意到這個,以及前面搜的時候有人說,要在OnCreate的時候不能在OnStart
一開始還以為我這個button1以及是Oncreate裡面了,沒想到這樣是不行的,要放在外邊

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.first_layout)
        val startActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){
                it -> when(it.resultCode) {
            Activity.RESULT_OK -> {
                val return_data = it.data?.getStringExtra("data_return")
                Log.d("FirstActivity", "return data is $return_data")
            }else -> {

            }
        }
        }
        .... 
        ....

        button1.setOnClickListener {
            val intent = Intent(this, SecondActivity::class.java)
            startActivity.launch(intent)
        }
}

這樣程式就沒問題了