三个小问题的记录:DialogFragment 返回键处理、chmod 权限速查、SSL 域名中的下划线问题。
DialogFragment 返回键处理
DialogFragment 没有直接复写返回键的方法,有两种方式可以实现。
方式一:在 onCreateDialog 中复写
| |
方式二:通过 onKeyListener
| |
现代方案:OnBackPressedDispatcher(AndroidX)
如果需要更高版本支持,推荐使用 AndroidX 的 OnBackPressedDispatcher。从 Fragment 1.6.1 开始,DialogFragment 默认返回 ComponentDialog,它自带独立的 OnBackPressedDispatcher,可以更优雅地处理返回键:
| |
详情可参考 Android Developer: ComponentDialog 和 OnBackPressedDispatcher。
chmod 权限速查
Linux 文件权限的八进制表示法:
| 权限 | 数字 | 说明 |
|---|---|---|
--- | 0 | 无权限 |
--x | 1 | 仅执行 |
-w- | 2 | 仅写入 |
-wx | 3 | 写入 + 执行 |
r-- | 4 | 仅读取 |
r-x | 5 | 读取 + 执行 |
rw- | 6 | 读取 + 写入 |
rwx | 7 | 读取 + 写入 + 执行 |
三个数字分别代表:所有者 / 组用户 / 其他用户。
常用权限组合
| |
安全建议: 避免使用
777。配置文件用600,可执行文件用755,普通文件用644。
SSL 域名中的下划线问题
项目中使用了一些包含 _ 的域名,在 HTTPS 连接时报错 javax.net.ssl.SSLHandshakeException,原因在于主机名中不允许使用下划线。
规范依据
根据 RFC 952 和 RFC 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。
参考资料
- Android Developer: ComponentDialog
- Android Developer: OnBackPressedDispatcher
- RFC 952 - Hostname Specifications
- RFC 1123 - Hostname Requirements
- RFC 2181 Section 11 - DNS Name Syntax
- RFC 2782 - SRV Record Specification
- StackOverflow: The use of the underscore in host names
- Wikipedia: Hostname - Restrictions