背景
我知道 Android Q 上有一个新功能最终支持深色主题(在这里写了关于检测它)。
我也知道有“夜灯”功能(这里)使屏幕变得更黄。
支持手动选择主题是我多年来一直在做的事情(在 Activity 的 onCreate 的第一行代码上简单地使用setTheme),但我想知道是否有自动的东西可以让我在应用程序真正启动之前设置它,在启动画面中。
问题
似乎一个非常古老的功能(从 API 8 开始!)在 Android 上已经存在了很长时间,在资源中有“夜间”限定符,我什至从未尝试过。
可悲的是,因为“黑暗主题”和与夜间相关的东西现在更多地被称为新功能(例如这里),所以我找不到旧功能的全部内容。
但是,查看一些文章和文档,它似乎几乎完全是手动的:
https://developer.android.com/reference/android/app/UiModeManager.html - 说我可以自己设置,包括将其设置为自动。但是,它似乎与停靠有关,甚至可能与汽车模式有关。
https://google-developer-training.github.io/android-developer-fundamentals-course-concepts/en/Unit%202/53_c_providing_resources_for_adaptive_layouts.html - 说我可以将“晚上”设置为限定符,并且有一个“夜间模式”。
我试过的
我尝试相应地设置各种主题:
res/drawable/splash.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
<item android:gravity="fill">
<shape android:shape="rectangle">
<solid android:color="#fff"/>
</shape>
</item>
...
</layer-list>
res/drawable-v29/splash.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
<item android:gravity="fill">
<shape android:shape="rectangle">
<solid android:color="?attr/colorSurface"/>
</shape>
</item>
...
</layer-list>
res/drawable-night/splash.xml
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:opacity="opaque" tools:ignore="UnusedAttribute">
<item android:gravity="fill">
<shape android:shape="rectangle">
<solid android:color="#000"/>
</shape>
</item>
...
</layer-list>
显现
res/values/themes.xml
<style name="AppTheme_splash" parent="@style/Theme.MaterialComponents.DayNight">
<item name="android:windowBackground">@drawable/splash</item>
</style>
res/values-v26/themes.xml
<style name="AppTheme_splash" parent="@style/Theme.MaterialComponents.DayNight">
<item name="android:windowSplashscreenContent">@drawable/splash</item>
</style>
我试图删除android:windowBackground
and android:windowSplashscreenContent
,试图查看它是否是自动的,但它没有帮助。
问题
基本上我只想知道夜间模式以及是否可以将其用于启动画面:
Android支持这么久的“夜间模式”什么时候开始?
它是操作系统全局模式吗?用户控制它吗?
是自动的吗?还是完全由当前应用手动操作?
即使我通过应用程序手动设置并且应用程序被杀死,该模式是否会保留?
是否可以将应用程序的主题(即启动画面)设置为使用它,以便在启用夜间模式时,它会使用它来获得深色背景?
我的代码对此是否正确?