| 
 | 
 
 
 楼主 |
发表于 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 更加类型安全和易于使用。 
 |   
 
 
 
 |