|

楼主 |
发表于 2025-8-27 22:16:16
|
显示全部楼层
- private ActivityResultLauncher<String> mPermissionResult = registerForActivityResult(
复制代码
中为什么要用<String> :
在 private ActivityResultLauncher<String> mPermissionResult = registerForActivityResult( 中使用 <String> 是因为 Java 的泛型机制,让我详细解释
1. ActivityResultLauncher<String>
这是泛型类的声明,其中 <String> 指定了类型参数:
ActivityResultLauncher 是一个泛型类
<String> 表示这个 launcher 处理的输入参数类型是 String
对应到实际使用中,就是权限名称(如 Manifest.permission.RECORD_AUDIO)
2. 为什么是 String 类型?
因为使用的是 ActivityResultContracts.RequestPermission 这个 contract:
- // RequestPermission contract 的定义
- public final class RequestPermission extends ActivityResultContract<String, Boolean> {
- @Override
- public Intent createIntent(@NonNull Context context, @NonNull String input) {
- // input 参数是 String 类型,代表权限名称
- // ...
- }
-
- @Override
- public Boolean parseResult(int resultCode, @Nullable Intent intent) {
- // 返回 Boolean 类型的结果
- // ...
- }
- }
复制代码
3. 泛型参数对应关系
ActivityResultContract<I, O> 有两个泛型参数:
I (Input): 输入参数类型 - 对应 ActivityResultLauncher<I>
O (Output): 输出结果类型 - 对应回调函数的参数类型
对于 RequestPermission:
输入类型 I = String (权限名称)
输出类型 O = Boolean (是否授权)
完整的类型匹配:
- // registerForActivityResult 方法签名
- @NonNull
- public final <I, O> ActivityResultLauncher<I> registerForActivityResult(
- @NonNull ActivityResultContract<I, O> contract,
- @NonNull ActivityResultCallback<O> callback) {
- // ...
- }
- // 使用时的类型推断
- ActivityResultLauncher<String> mPermissionResult = registerForActivityResult(
- new ActivityResultContracts.RequestPermission(), // ActivityResultContract<String, Boolean>
- result -> { // ActivityResultCallback<Boolean>,result 是 Boolean 类型
- // ...
- }
- );
复制代码
其他 Contract 的示例
为了更好地理解,这里给出其他 contract 的泛型使用示例:
- // 启动 Activity 并获取结果
- ActivityResultLauncher<Intent> activityLauncher = registerForActivityResult(
- new ActivityResultContracts.StartActivityForResult(), // ActivityResultContract<Intent, ActivityResult>
- result -> { // result 是 ActivityResult 类型
- // 处理 Activity 结果
- }
- );
- // 请求多个权限
- ActivityResultLauncher<String[]> multiplePermissionLauncher = registerForActivityResult(
- new ActivityResultContracts.RequestMultiplePermissions(), // ActivityResultContract<String[], Map<String, Boolean>>
- result -> { // result 是 Map<String, Boolean> 类型
- // 处理多个权限请求结果
- }
- );
复制代码
总结
使用 <String> 是因为:
RequestPermission contract 需要一个 String 类型的权限名称作为输入参数
Java 泛型机制要求在声明时指定具体类型
这样可以提供编译时类型检查,避免运行时类型错误
确保 launch() 方法只能传入 String 类型的参数
这种设计使得 API 更加类型安全和易于使用。
|
|