我想在我的APP中实现夜间模式(手动切换日夜模式),我了解到我可以使用UiModeManager.setNightMode()并添加一些资源,values-night并将drawable-night其存档.
在文档中,setNightMode()我们需要enableCarMode().
使用下面的代码可以工作,但问题出现了.
UiModeManager uiManager = (UiModeManager) getSystemService(Context.UI_MODE_SERVICE);
if (isNightMode) {
uiManager.enableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_YES);
} else {
uiManager.disableCarMode(0);
uiManager.setNightMode(UiModeManager.MODE_NIGHT_NO);
}
Run Code Online (Sandbox Code Playgroud)
它显示允许用户退出汽车模式的通知.
您有任何想法禁用此通知吗?
或者这些只是意味着它不是实现Android夜间模式的最佳方式.启用汽车模式会对我的APP或手机产生任何奇怪的影响吗?
PS:我想知道为什么我们需要在设置夜间模式之前启用汽车模式.这有什么深刻的考虑吗?
PPS:我已经知道我可以改变主题来切换日夜模式.它需要调用this.recreate()并导致屏幕闪烁一秒钟.
PPPS:如果UiModeManager.setNightMode并且change theme既不是实施夜间模式的最佳方式,我还有什么选择?
编辑:
方法1: UiModeManager.setNightMode
方法2: change theme
再次编辑:
我认为我的想法是错误的.禁用通知没有意义,但允许汽车模式.
我想要的只是像方法1一样实现夜间模式,而不设置桌面或汽车模式,不显示闪烁.
最后
使用UiModeManager.setNightMode和启用汽车模式不是实现夜间模式的好方法.因为它在Android 5.0及更高版本中产生了一些效果.
启用汽车模式并且APP正在运行时,我按下了主页按钮,发生了一些奇怪的事情(在nexus 7 Android 5.1.1中测试).如下图所示:
启动Android Auto
在汽车的显示屏上查找Android Auto按钮即可启动
不幸的是,UiModeManager.setNightMode除非需要汽车模式,否则不能使用.
除了启用汽车模式,结果是完美的,对于开发人员,它可以只是制作一些文件夹drawable-night,values-night而不需要更改太多的代码.模式更改时,它会发送广播并将系统配置切换到适当的UI模式.
虽然有很多好处,但夜间模式是错误的.
我仍然想知道为什么汽车模式和夜间模式如此紧密结合.
我想生成这样的代码:
class B private constructor() : A {
companion object {
val instance: B by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
B()
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用 KotlinPoet:
private fun genCompanionObject() = TypeSpec.companionObjectBuilder()
.addProperty(PropertySpec.builder("instance", A::class.java).build()).build()
Run Code Online (Sandbox Code Playgroud)
如何生成by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED)?我在文档中找不到一些有用的API 。