我有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"
}
}
//...
}
另一个应用涉及更多:
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将显示返回的意图为空。
我的问题:
finishAfterTransition()
发送数据,则不应在应用程序的其他位置调用startActivityForResult()
。 finishAfterTransition()
导致与对finish()
的任何调用发生冲突,并且您将发送空结果和RESULT_CANCELLED的ResultCode。