Android似乎忽略了我对onActivityResult的setResult调用

问题描述 投票:0回答:1

我有2个应用,其中一个非常简单的玩具应用可以调用另一个:

const val AUTHENTICATE_CODE = 42

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        setSupportActionBar(toolbar)

        fab.setOnClickListener {
            Intent(Intent.ACTION_VIEW, Uri.parse("testapp://hello.world/")) //2nd app has intent filter to intercept this.
                .also { intent -> startActivityForResult(intent, AUTHENTICATE_CODE) }

        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        val textView = findViewById<TextView>(R.id.hello_text)

        if (requestCode == AUTHENTICATE_CODE && resultCode == Activity.RESULT_OK) {
            requireNotNull(data) {
                textView.text = "Error: Intent was null. Data lost."
                return@onActivityResult
            }
        val dataExtra = data.getStringExtra("com.example.app.DATA")
        requireNotNull(dataExtra){
            textView.text = "Error: Intent did not contain data."
            return@onActivityResult
        }
            Log.d("TestAppPlsIgnore", "Result Intent received")
            textView.text = "Success! $dataExtra"
        } else {
            textView.text = "Something went wrong. Request = $requestCode; Result = $resultCode"
        }
    }
//...
}

另一个应用涉及更多:

  • 玩具应用程序启动的应用程序2中的活动实现了Jetpack的导航库。
  • 该活动的导航图中的大多数片段都实现相同的ViewModel。即private val mainViewModel by activityViewModels<MainActivityViewModel>()
  • MainActivityViewModel内是一个LiveData<String>,我们将其称为data。应用程序2的MainActivity的观察者正在观看类似于以下内容的数据:

    val dataObserver = Observer<String> { data ->
        val result = Intent()
        result.putExtra("com.example.app.DATA", data)
        Log.d("MainActivity.DataObserver", "Sending data $data")
        setResult(Activity.RESULT_OK, result)
        finish()
    }
    mainViewModel.data.observe(this, dataObserver)
    
  • 在到达将字符串放入data的一般流程中,主要活动的导航视图可能会在一个或多个片段之间导航。

预期结果:将字符串添加到应用程序2中的data时,观察者将创建结果意图,将其设置为结果,并完成应用程序2。应用程序1将接收结果并调用onActivityResult,我们应该显示“成功!”加上一些数据。

我得到的东西:观察者确实在工作。日志语句显示观察者已接收到正确的数据。 App 2完成。应用1的onActivityResult显示失败情况,显示正确的请求代码,但响应代码== Activity.RESULT_CANCELLED。如果requireNotNull(data)语句移到if语句之外,则应用1将显示返回的意图为空。

我的问题:

  1. RESULT_CANCELLED没有显式返回,我正尝试返回数据意图。因此,这仅会使活动崩溃,这是返回RESULT_CANCELLED的原因。在导航图上导航将不可避免地导致某些碎片到达其生命周期的尽头。 Android会将其混淆为活动崩溃吗?
  2. 为什么在调用onActivityResult时会有一个空意图?在大多数情况下,如果稍​​微冗长一些,我只是遵循outlined in the documentation
  3. 这不是在两个特定应用之间发送简单字符串的正确方法吗?我不想使用共享意图,因为这是为了在特定应用之间进行更直接的交流,而不是在我的应用与某类应用之间进行广泛的交流。
android onactivityresult
1个回答
0
投票
事实证明,如果您打算使用像我的基于Observer的设置通过finishAfterTransition()发送数据,则不应在应用程序的其他位置调用startActivityForResult()finishAfterTransition()导致与对finish()的任何调用发生冲突,并且您将发送空结果和RESULT_CANCELLED的ResultCode。
© www.soinside.com 2019 - 2024. All rights reserved.