私は2つのアプリを持っています。1つは他を呼び出すために存在する非常に単純なおもちゃのアプリです。
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
では、メインアクティビティのナビゲーションビューが1つ以上のフラグメント間を移動する可能性があります。期待される結果:data
アプリ2で文字列が追加されると、オブザーバーは結果インテントを作成し、それを結果として設定して、アプリ2を終了します。アプリ1は結果を受け取り、onActivityResultを呼び出し、「Success! 「」プラスいくつかのデータ。
私が得るもの:オブザーバーは機能します。ログステートメントは、オブザーバーが正しいデータを受信したことを示しています。アプリ2が終了します。また、アプリ1のonActivityResultは失敗のケースを表示し、正しいリクエストコードを示しますが、レスポンスコード== Activity.RESULT_CANCELLEDです。requireNotNull(data)
ステートメントがステートメントの外に移動された場合if
、アプリ1は代わりに、返されたインテントがnullであったことを示します。
私の質問:
finishAfterTransition()
私のようなオブザーバーベースのセットアップを使用してデータを送信する場合は、アプリの他の場所に電話をかけるべきではないことがわかりましたstartActivityForResult()
。finishAfterTransition()
への呼び出しと競合が発生しfinish()
、nullの結果とRESULT_CANCELLEDのResultCodeが送信されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加