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

Fragment弹出权限对话框时宿主Activity被销毁的技术求助

解决Fragment请求权限时宿主Activity被销毁的问题

我之前碰到过类似的情况,这种问题一般和Activity的生命周期异常、权限请求的时机不对有关,给你几个具体的解决思路:

  • 先排查配置变更导致的Activity重建
    如果你的App在权限弹窗弹出时刚好触发了屏幕旋转等配置变化,Activity会默认重建,看起来就像被销毁了。你可以先在AndroidManifest.xml里给宿主Activity加上配置变更的声明,阻止系统重建:

    <activity
        android:name=".YourHostActivity"
        android:configChanges="orientation|screenSize|keyboardHidden">
    </activity>
    

    不过这只是临时方案,长期来看建议你处理Activity的状态保存与恢复,避免依赖这个配置。

  • 确保请求权限时Fragment和Activity处于活跃状态
    在发起权限请求前,一定要先判断Fragment是否还依附在Activity上,并且Activity没有处于销毁流程中,避免在异常状态下发起请求导致问题:

    if (isAdded() && getActivity() != null && !getActivity().isFinishing()) {
        if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) { 
            Toast.makeText(getActivity(), "Please allow permission so we can retrieve the OTP.", Toast.LENGTH_SHORT).show(); 
            requestPermissions(new String[]{android.Manifest.permission.RECEIVE_SMS}, 441); 
        }
    }
    
  • 正确处理权限请求的回调
    确保你在Fragment内部重写onRequestPermissionsResult方法,而不是在Activity里处理。这样即使Activity发生重建,Fragment也能正确接收权限结果,避免因为回调错位导致的异常:

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 441) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 权限获取成功,执行获取OTP的逻辑
            } else {
                Toast.makeText(getActivity(), "Permission denied, we can't retrieve OTP automatically.", Toast.LENGTH_SHORT).show();
            }
        }
    }
    
  • 检查Activity的onDestroy触发原因
    你可以在宿主Activity的onDestroy方法里加个Log,看看这个方法是在什么时候被调用的:

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("HostActivity", "onDestroy triggered");
    }
    

    这样能排查是不是有其他逻辑(比如误调用了finish()、内存不足被系统回收)导致Activity被销毁,而不是权限请求本身的问题。

内容的提问来源于stack exchange,提问作者Raju Ugale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:25:20