三个小问题的记录:DialogFragment 返回键处理、chmod 权限速查、SSL 域名中的下划线问题。

DialogFragment 返回键处理

DialogFragment 没有直接复写返回键的方法,有两种方式可以实现。

方式一:在 onCreateDialog 中复写

1
2
3
4
5
6
7
8
9
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    return new Dialog(getActivity(), getTheme()){
        @Override
        public void onBackPressed() {
            // 在这里处理返回键逻辑
        }
    };
}

方式二:通过 onKeyListener

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
@Override
public void onResume() {
    super.onResume();
    Dialog dialog = getDialog();
    if (dialog != null) {
        dialog.setOnKeyListener(this);
    }
}

@Override
public void onPause() {
    super.onPause();
    Dialog dialog = getDialog();
    if (dialog != null) {
        dialog.setOnKeyListener(null);
    }
}

现代方案:OnBackPressedDispatcher(AndroidX)

如果需要更高版本支持,推荐使用 AndroidX 的 OnBackPressedDispatcher。从 Fragment 1.6.1 开始,DialogFragment 默认返回 ComponentDialog,它自带独立的 OnBackPressedDispatcher,可以更优雅地处理返回键:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class MyDialogFragment : DialogFragment() {
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return super.onCreateDialog(savedInstanceState).also { dialog ->
            val componentDialog = dialog as ComponentDialog
            componentDialog.onBackPressedDispatcher.addCallback(componentDialog) {
                // 自定义返回键处理
            }
        }
    }
}

详情可参考 Android Developer: ComponentDialogOnBackPressedDispatcher

chmod 权限速查

Linux 文件权限的八进制表示法:

权限数字说明
---0无权限
--x1仅执行
-w-2仅写入
-wx3写入 + 执行
r--4仅读取
r-x5读取 + 执行
rw-6读取 + 写入
rwx7读取 + 写入 + 执行

三个数字分别代表:所有者 / 组用户 / 其他用户

常用权限组合

1
2
3
4
5
6
sudo chmod 600 ×××   # 仅所有者可读写
sudo chmod 644 ×××   # 所有者读写,组用户和他人只读(通用文件权限)
sudo chmod 700 ×××   # 仅所有者有全部权限(脚本/私钥)
sudo chmod 755 ×××   # 所有者全部权限,其他人读+执行(可执行文件/目录)
sudo chmod 666 ×××   # 所有人可读写(不常用)
sudo chmod 777 ×××   # 所有人全部权限(风险高,慎用)

安全建议: 避免使用 777。配置文件用 600,可执行文件用 755,普通文件用 644

SSL 域名中的下划线问题

项目中使用了一些包含 _ 的域名,在 HTTPS 连接时报错 javax.net.ssl.SSLHandshakeException,原因在于主机名中不允许使用下划线。

规范依据

根据 RFC 952RFC 1123,主机名(hostname)的每个标签只能包含 ASCII 字母、数字和连字符(-),不允许包含下划线(_)。受影响的记录类型包括 A、AAAA、MX、CNAME 等。

下划线在 DNS 中并非完全禁用 — RFC 2181 Section 11 允许 DNS 标签包含任意二进制字符,但主机名有更严格的限制。RFC 2782 在 SRV 记录中故意引入下划线前缀(如 _sip._tcp.example.com),以避免与主机名冲突。

总结

  • 主机名(URL、SSL 证书等):不允许下划线
  • SRV 记录等服务发现用途:需要下划线前缀
  • 解决方案:去掉域名中的 _,改用连字符或其他合规字符

相关讨论见 StackOverflow: The use of the underscore in host names

参考资料