You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:09:04