StartActivityForResult()启动其他应用程序,但立即返回RESULT_CANCELED。

3
当我尝试使用新的androidx.activity.result API通过getLaunchIntentForPackage()启动另一个应用程序并使用startForResult时,这个应用程序会启动,但在我的调用应用程序中,我立即收到RESULT_CANCELED。我做错了什么?
class MainActivity : AppCompatActivity() {

    private val startForResult =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult ->
            if (result.resultCode == Activity.RESULT_OK) {
                findViewById<TextView>(R.id.message)?.text = "RETURNED OK!! "
            }
            else if (result.resultCode == Activity.RESULT_CANCELED) {
                findViewById<TextView>(R.id.message)?.text = "RETURNED CANCELED!!"
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        val button = findViewById<MaterialButton>(R.id.button)
        button.setOnClickListener {
            startForResult.launch(getMyapplicationIntent())
        }
    }

    private fun getMyapplicationIntent(): Intent? {
        return packageManager.getLaunchIntentForPackage("com.example.myapplication")
    }
}

在AndroidManifest中使用查询:
<queries>
    <package android:name="com.example.myapplication" />
</queries>

2
由于启动Intent不返回结果,您可以摆脱大部分代码,只需在Intent上调用startActivity()即可。 - CommonsWare
1
@CommonsWare启动Intent无法返回结果?这是一个很好的信息!谢谢! - botzek13
2个回答

2

我发现当使用指定标记启动该活动时,会出现这种情况。

Intent.FLAG_ACTIVITY_NEW_TASK

2

是的,Davide's 的通知是正确的!

官方 Android 文档 关于 Intent.FLAG_ACTIVITY_NEW_TASK 的说明如下:

当调用者请求从被启动的活动中返回结果时,不能使用此标志。

这正是我们从 ActivityResultContracts.StartActivityForResult() 中期望得到的确切结果。

我对权限 Activities 的解决方案如下(在 AndroidManifest.xml 中

<!-- Some permission Activity -->
<activity
    android:name=".YourActivityName"
    ...
    android:excludeFromRecents="true"
    android:noHistory="true"
    android:launchMode="singleTop"
    ... />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接