如何在非Fragment/Activity的Java类中调用registerForActivityResult
非Fragment/Activity类调用registerForActivityResult的实现方案
可以间接实现,不能直接在普通Java类中调用该方法。registerForActivityResult是ComponentActivity(AppCompatActivity的父类)和Fragment才有的专属API,必须依赖这两类实例的生命周期上下文才能完成注册、正常接收返回结果。
两种常用的实现方式如下:
方式1:传入宿主Activity/Fragment实例注册
你需要将对应的宿主实例传入自定义类,在宿主的onCreate生命周期阶段完成注册即可:
public class Hello { private ActivityResultLauncher<String[]> mMultipleActivityResultLauncher; // 传入AppCompatActivity作为宿主注册 public Hello(AppCompatActivity hostActivity) { mMultipleActivityResultLauncher = hostActivity.registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), isGranted -> { // 此处处理权限申请结果 } ); } // 对外暴露启动权限申请的方法 public void requestNecessaryPermissions(String[] permissions) { mMultipleActivityResultLauncher.launch(permissions); } }
- 调用时必须在Activity的
onCreate方法中初始化Hello类实例,晚于该生命周期阶段注册会触发运行时异常。如果用Fragment作为宿主,只需将构造参数替换为Fragment实例调用注册即可。
方式2:无UI空Fragment代理注册
如果不想和宿主的业务代码耦合,可在自定义类内部创建一个无UI的空白Fragment,添加到宿主的FragmentManager中,用这个空白Fragment调用registerForActivityResult完成注册逻辑,不需要宿主做额外适配。
注意:所有
ActivityResultLauncher的注册操作必须在宿主进入STARTED生命周期之前完成,禁止在点击事件、异步回调等晚于onCreate的时机执行注册操作,否则会直接抛出异常。
内容的提问来源于stack exchange,提问作者allim
相关产品推荐
相关产品推荐

