Android开发 AlarmManager set() 方法与WiFi忘记连接问题分析
AlarmManager set() 方法与WiFi忘记连接问题分析
WiFi连接问题:
问题描述:
设备在断电重启后,有时会"忘记"WiFi连接,需要重新输入密码进行连接。
可能的原因
- WiFi配置在关机前未正确保存
- 关机序列中的时序问题
- 缓冲区写入操作在断电前未完成
修改文件:frameworks/base/apex/jobscheduler/framework/java/android/app/AlarmManager.java
public void set(@AlarmType int type, long triggerAtMillis, @Nullable String tag,@NonNull OnAlarmListener listener, @Nullable Handler targetHandler) {Log.d(TAG,"tag: "+tag+" triggerAtMillis: "+triggerAtMillis+" type: "+type); if(type == ELAPSED_REALTIME_WAKEUP && "WriteBufferAlarm".equals(tag)){triggerAtMillis = triggerAtMillis - 9 * 1000;}setImpl(type, triggerAtMillis, legacyExactLength(), 0, 0, null, listener, tag,targetHandler, null, null);
}
特殊处理逻辑:
代码包含一个特殊条件,当闹钟类型为ELAPSED_REALTIME_WAKEUP且标签为**“WriteBufferAlarm”**时,会将触发时间提前9秒。
特殊处理如何帮助解决问题
通过将"WriteBufferAlarm"提前9秒触发,系统确保:
- WiFi配置缓冲区在可能的断电前被写入
- 关键的保存操作在关机序列前完成
- 在时间敏感的场景中优先处理数据持久化
带有特殊处理的执行流程
1设置类型为ELAPSED_REALTIME_WAKEUP、标签为"WriteBufferAlarm"的闹钟
原始触发时间: T
2检测到特殊条件
闹钟类型和标签匹配特殊处理条件
3调整触发时间
新的触发时间: T - 9秒
4闹钟提前触发
缓冲区写入操作在可能的断电前完成
5WiFi配置得以保留
断电重启后,设备记住WiFi连接
技术解释
WriteBufferAlarm的作用
"WriteBufferAlarm"负责将WiFi配置数据刷新到持久存储中。这确保了连接详细信息在重启和断电周期中得以保存。
时序的重要性
在关机序列或断电事件期间,写入操作完成的时间窗口有限。通过提前9秒触发闹钟,系统增加了以下可能性:
- 关键写入操作更早开始
- 数据在意外断电前被持久化
- 即使在时间限制下,缓冲区也能被刷新
结论
通过提前9秒触发"WriteBufferAlarm"的特殊处理,是针对设备关机或断电事件期间时序相关问题的一种缓解策略。
这种调整增加了WiFi配置数据在完全断电前成功写入持久存储的概率,从而防止了设备在断电重启后"忘记"WiFi连接的问题。
虽然这不是所有场景的绝对解决方案,但这种方法显著减少了在意外断电事件期间数据丢失的概率。