📅  最后修改于: 2023-12-03 15:34:42.714000             🧑  作者: Mango
requestCode
、registerForActivityResult
和使用低 16 位的限制在 Android 开发中,有时需要启动一个子活动并从其返回结果。为此,我们可以使用 startActivityForResult()
方法。该方法需要两个参数:要启动的子活动的 Intent
对象及一个 requestCode
。
在 Kotlin 或 Java 等语言中,我们也可以使用 ActivityResultLauncher
来启动一个子活动。这比原来的方式更加灵活、可读性更高。
当我们使用 registerForActivityResult()
方法来创建一个 ActivityResultLauncher
实例时,也需要指定一个 requestCode
。
然而,requestCode
是一个整数,且有着极大的范围。如果我们使用了过大的 requestCode
或者没有良好的命名规则来管理它们,就可能会出现互相覆盖的情况。因此,我们需要在使用 requestCode
时特别细心。
另外值得注意的是,requestCode
只能使用低 16 位。这是因为在 Android 系统中,高 16 位可能会由系统内部使用。如果我们使用了高 16 位来作为 requestCode
,就可能会产生冲突。
以下是一个 TypeScript 版本的代码片段,展示了如何使用 ActivityResultLauncher
和 registerForActivityResult()
方法:
import { ActivityResultCallback, ActivityResultLauncher, registerForActivityResult } from 'react-native'
// 创建一个 ActivityResultLauncher 实例,并指定 requestCode 为 1234
const myLauncher: ActivityResultLauncher<string> = registerForActivityResult({ requestCode: 1234 }, (result) => {
if (result.resultCode == 'RESULT_OK') {
console.log('Received result:', result.data)
} else {
console.log('Activity cancelled or failed:', result)
}
})
// 接下来可以在合适的时候调用 `myLauncher.launch()` 来启动一个子活动。
// 在子活动返回结果后,会调用回调函数并传入结果信息。我们可以根据结果信息进行相应的处理。
以上代码中,我们通过 registerForActivityResult()
方法创建了一个 myLauncher
实例,并指定它的 requestCode
为 1234。这个 myLauncher
实例可以用来启动一个子活动,并在子活动返回结果时调用回调函数。
requestCode
是一个整数值,我们需要特别注意其取值范围和命名规则,避免互相冲突。同时,由于系统内部可能会使用高 16 位,因此我们只能使用低 16 位来作为 requestCode
。
在使用 ActivityResultLauncher
的时候,我们可以通过 registerForActivityResult()
方法来创建一个实例,并在其中指定 requestCode
和回调函数等信息。并且我们可以在使用 ActivityResultLauncher
的过程中非常灵活地处理回调等操作。