AppCompatDelegate.setDefaultNightMode致部分设备无限循环、闪烁及Activity重启
解决在super.onCreate前设置夜间模式导致的崩溃、闪屏及Activity循环重启问题
问题根源
在super.onCreate(savedInstanceState)调用前执行AppCompatDelegate.setDefaultNightMode()会触发系统的UI模式配置变更,而此时Activity还未完成初始化流程。部分设备的系统对这种提前触发的配置变更兼容性不足,会导致Activity被强制重新创建,进而进入循环重启的死循环,同时伴随界面闪烁甚至直接崩溃。
解决方案
调整调用时机到super.onCreate之后
将夜间模式设置代码移至super.onCreate执行完成后,确保Activity初始化流程正常完成后再触发配置变更,避免系统异常。示例代码:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 正确的夜间模式设置时机 AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); setContentView(R.layout.activity_main); // 后续初始化逻辑 }全局设置(推荐)
如果需要所有页面统一应用夜间模式,直接在Application的onCreate方法中配置,这样所有Activity启动前就已完成模式设置,不会触发单个Activity的配置变更。示例代码:public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); } }注意要在AndroidManifest.xml中声明自定义Application:
<application android:name=".MyApp" ...> ... </application>兼容配置变更(备选方案)
如果必须在Activity启动时动态切换且避免重启,可在Activity的Manifest标签中添加uiMode配置变更监听,手动处理UI适配,但此方式需自行维护所有UI元素的夜间模式适配,成本较高。示例:<activity android:name=".MainActivity" android:configChanges="uiMode"> </activity>然后重写配置变更方法:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); int nightMode = newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK; // 根据nightMode值手动更新UI if (nightMode == Configuration.UI_MODE_NIGHT_YES) { // 应用夜间样式 } else { // 应用日间样式 } }
内容的提问来源于stack exchange,提问作者JR Tan
相关产品推荐
相关产品推荐

