本文介绍一种 Kotlin 开发模式,用于在临时模式(如共享会话、通话、低电量状态)期间关闭某个用户功能,但绝不要写入用户存储的偏好设置。核心原则是:模式是临时的,存储的设置不是。如果通过改写存储偏好来关闭功能,退出时再恢复,由于进程死亡、崩溃、任务被杀或未处理异常等,退出路径不保证执行,会导致用户真实设置被静默改写。正确做法是在组件上增加一个内存中的抑制标志(如 featureSuppressed),模式进入时设置,退出时清除,存储偏好完全不读写。使用时,功能检查应组合 enabled && !suppressed,且覆盖标志默认关闭,在字段初始化器中设置。生命周期应由同一个“是否处于模式”的信号驱动:用一个收集器监听该标志,写入覆盖值,并清除模式携带的其他状态。覆盖标志必须应用到功能可以启动的每一个路径,如轮询循环和项目结束回调,否则会出现无声的错误。若同时有两个模式需要抑制,布尔值应改为计数器。日志应记录进入和退出两个转换。覆盖标志应放在组件自己的接口上,并加注释说明为何不使用偏好设置。验证时,可用 grep 命令查找覆盖声明、实现、写入者和遵守点,确保每个遵守点同时读取 enabled 和覆盖标志,并确认写入文件没有偏好写入调用。行为验证:进入模式,确认功能关闭,从外部强制停止进程,重新启动,设置应保持用户原样,功能应立即可用。
runtime-override-not-preference-write
编程与开发
更新于 10-17 16:16