You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android开发:onActivityResult始终无法触发的问题求助

笔记应用开发问题求助

我在Android Studio开发简易笔记应用时遇到两个问题:

  • 通过Bundle将Note对象传递至第二个Activity正常,但修改后的Note对象无法同步回原对象,推测是序列化时生成了新引用(刚接触Android,不确定这个猜测是否正确)。
  • 尝试了已弃用的startActivityForResult()和新的registerForActivityResult()方法,均无法触发onActivityResult回调,怀疑Manifest设置存在问题,排查1小时仍未解决。

相关代码

MainActivity 代码片段

override fun onItemClick(note: Note) {
    val intent = Intent(this@MainActivity, NoteViewActivity::class.java)
    val bundle = Bundle()
    bundle.putParcelable("note", note)
    intent.putExtras(bundle)

//        val startForResult = registerForActivityResult(
//            ActivityResultContracts.StartActivityForResult()
//        ) { result: ActivityResult ->
//            Log.d("result", "result was reached by contract")
//            if (result.resultCode == Activity.RESULT_OK) {
//                Log.d("result", "result was reached by contract")
//                val data: Intent? = result.data
//            }
//        }
//
//        startForResult.launch(intent)
    startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE)
}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    Log.d("ACTIVResult", "ActivityResult was called")
}

NoteViewActivity 代码

class NoteViewActivity: AppCompatActivity() {
    private var note: Note? = null

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when (item.itemId) {
            android.R.id.home -> {
                saveChangeAndFinish()
                return true
            }
        }

        return super.onOptionsItemSelected(item)
    }

    fun saveChangeAndFinish() {
        val resultIntent = Intent()
//        resultIntent.putExtra("updatedNote", note)
        resultIntent.putExtra("test", "test")
        setResult(RESULT_OK, resultIntent)
        Log.d("resultIntentV2", resultIntent.extras.toString())
        finish()
    }
}

解决建议

1. 修复ActivityResult回调不触发问题

  • 检查Activity启动模式:确认Manifest中NoteViewActivity的launchMode未设置为singleInstance或singleTask,这两种模式会阻断回调传递,使用默认的standard模式即可。
  • 确认请求码合法性:SECOND_ACTIVITY_REQUEST_CODE必须是大于等于0的整数,负数会导致回调无法触发。
  • 正确使用registerForActivityResult:不要在点击事件内部注册回调,需将注册代码放在Activity的成员变量位置(仅注册一次),示例代码如下:
class MainActivity : AppCompatActivity() {
    // 成员变量位置注册回调,仅初始化一次
    private val noteUpdateResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
        if (result.resultCode == Activity.RESULT_OK) {
            Log.d("result", "回调触发成功")
            val data = result.data
            // 后续处理回传数据
        }
    }

    override fun onItemClick(note: Note) {
        val intent = Intent(this, NoteViewActivity::class.java)
        intent.putExtra("note", note)
        noteUpdateResult.launch(intent)
    }
}

2. 解决Note对象同步问题

你的猜测是正确的:通过Parcelable传递对象时,系统会通过序列化+反序列化生成新的对象实例,第二个Activity修改的是新对象,原对象不会自动同步。解决方法是:

  • 在NoteViewActivity中修改完Note内容后,将更新后的对象通过Intent回传。
  • 在MainActivity的回调中接收回传的对象,手动更新原数据源(比如RecyclerView的列表)并刷新UI。

修正后的NoteViewActivity回传代码:

fun saveChangeAndFinish() {
    // 先从UI更新note对象的内容(示例)
    // note?.title = titleEditText.text.toString()
    // note?.content = contentEditText.text.toString()
    
    val resultIntent = Intent()
    resultIntent.putExtra("updatedNote", note) // 回传更新后的Note
    setResult(RESULT_OK, resultIntent)
    finish()
}

在MainActivity的回调中处理更新:

private val noteUpdateResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val updatedNote = result.data?.getParcelableExtra<Note>("updatedNote")
        updatedNote?.let {
            // 找到原列表中对应的Note对象并替换
            // 示例:val index = notesList.indexOfFirst { it.id == updatedNote.id }
            // if (index != -1) {
            //     notesList[index] = updatedNote
            //     recyclerView.adapter?.notifyItemChanged(index)
            // }
        }
    }
}

内容的提问来源于stack exchange,提问作者case_sensitive

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:25:55