禁用Android 12默认闪屏界面

36
在Google I/O演示中,谷歌团队表示我们可以禁用默认启动画面。我想这样做,但是我找不到方法。
有人成功实现了吗?
后来编辑:
我误解了视频中讲话者的意思。似乎你只能编辑默认启动画面,而不能禁用它。

请问您能否提供谷歌员工提到禁用启动画面的视频链接? - Faiizii Awan
我没有听说过有人明确表示你可以禁用自动启动画面。我听到的最接近的是在这个视频中,他们至少在7-8分钟左右两次说到,希望能够将自动启动画面替换为自己的旧版启动画面实现,但并没有详细说明具体的操作方法。 - Michael
我有一个已声明为LAUNCHER的认证活动,它会导向另一个主要活动,但该活动并不是启动器,但当我导航到它时,它会显示新的闪屏。它的API非常小,文档也相当稀少。退出应该很简单,但我没有看到任何相关内容。 - Conti
Michael,是的。你说得对。我误解了。@FaiiziiAwan Michael发布的链接就是我所指的视频。看来这是我的错误。 - Denis Coman
是的 @Micheal,我也发现我们可以更新启动画面的设计和延迟时间。它被设计用来处理应用程序的启动时间。这是一个在安卓设备上很常见的问题,因为它会因设备而异。 - Faiizii Awan
似乎唯一正确的方法是通过谷歌提供的工具将您的应用程序启动时间减少到接近零。 - Ali Has
7个回答

34
您可以添加这一行:
          <item name="android:windowIsTranslucent">true</item>    

在您的style.xml文件中,在关闭样式标签之前插入以下代码。这将使您的默认Android启动画面透明!

似乎工作得足够好。这会影响其他任何事情,还是只有闪屏? - Michael Plischke
是的,这对整个应用程序有很大的影响。您可以使用postSplashScreenTheme项,在展示启动画面后将windowIsTranslucent设置为“false”。 - Ilya Zagarovsky
9
请注意,这将降低用户体验,因为在用户触摸图标和您的活动实际出现之间没有任何事情发生,从而增加了感知延迟时间。 - Vadim Caen
事情进行得非常顺利 - Gulnaz Ghanchi

22
在Android 12上,无法选择退出启动画面的选项。只能自定义它:图标、窗口背景和退出动画。
默认情况下,从用户触摸屏幕开始到应用程序第一帧被绘制之前,会显示启动画面,因此为了尽量减少启动画面的显示时间,可以尝试减少应用程序的启动时间。
您还可以实现自己的退出动画,使从启动画面到应用程序的过渡更加流畅。
如果您以前使用过专用的SplashScreen Activity并希望保留该Activity,则可以参考官方docs提供的解决方法。

我也搜索了很多,但只有可自定义选项。到目前为止没有找到任何禁用选项。 - Faiizii Awan
18
作为一名应用程序开发者,这真的很让我烦恼。这使得我创建的每个启动画面都变得无用了。 - Kris Craig
6
我同意Kris,我认为这很大程度上是毫无意义和限制性的。现在,所有的应用程序将失去它们的独特性,换取一些俗气的(而且可能经常质量低劣的)最多1秒钟的动画通过一个相对较小的孔出现。我真诚地认为这是一个倒退的步伐。 - Andrew S
应用程序启动应尽可能快,我们不应该让用户在闪屏界面等待,只是为了展示一个漂亮的动画。如果需要进行身份验证,则创建一个身份验证屏幕,并在网络缺失的情况下提供良好的备选方案更好。此外,这个新的闪屏界面在应用程序进程创建时运行,因此它隐藏了触摸和应用程序绘制之间存在的延迟。如果确实需要一些动画效果,那么可以过渡到自定义闪屏界面。请参见我的示例 - Vadim Caen
现在可以使用以下代码实现窗口半透明: <item name="android:windowIsTranslucent">true</item> - Vahit Keskin

10
很不幸,在Android 12设备上,您不能通过他们提供的API直接禁用默认的启动画面。如果您的应用程序具有自定义启动画面,并且您不想迁移到这种新方法,则可以尝试以下黑客技巧。基本上,您需要在res\values-v31\themes.xml中覆盖您的启动屏幕主题并设置一个透明的图标。
<!-- My custom theme for splash screen activity -->
<style name="Theme.Splash" parent="Theme.Main">
    <item name="android:windowBackground">@color/background</item>
    <!-- Set a transparent .png as your icon -->
    <item name="android:windowSplashScreenAnimatedIcon">@drawable/transparent_image</item>
</style>

这将帮助你消除app在启动时闪屏期间出现的默认应用程序图标。

6

没有直接的API可以禁用默认的启动画面,但是如果我们在样式中添加<item name="android:windowIsTranslucent">true</item>

<style name="Theme.RemoveSplashScreenTheme" parent="@style/BaseTheme">
    <item name="android:windowIsTranslucent">true</item>
</style>

并将其应用于启动屏幕活动。

<activity
        android:name="com.test.SplashScreenActivity"
        android:launchMode="singleInstance"
        android:theme="@style/Theme.RemoveSplashScreenTheme"
        android:noHistory="true" />

这将用透明屏幕替换默认的启动画面。如果应用程序已经有一个启动画面,这个解决方法将消除2个启动画面的问题。


3
你后面 <activity> 元素中的 android:theme 值与 <style> 资源中的主题名称不匹配。我可以让 <style> 方法起作用,但是 android:windowIsTranslucent="true"<activity> 上没有被记录为可用,所以我无法让它起作用。此外,请注意系统启动画面虽然看不见,但仍会在原本应该出现的时间内存在,因此似乎应用程序在启动器图标点击后一段时间内未响应 - 这可能对某些应用程序造成问题。总之,这是一个有趣的技巧! - CommonsWare
1
@CommonsWare 感谢您的建议并更新了我的回答。是的,这将使系统闪屏不可见,并且可能看起来应用程序未响应。如果您遇到此问题,请检查此处提到的第二种方法 https://dev59.com/GcHqa4cB1Zd3GeqPuTBy#68430880。 - Karthik Bollisetti

3

Android 12中引入的默认启动画面禁用并不是一件简单的事情。在我看来,最简单的方法是修改应用程序样式。

在应用程序的values/styles.xml文件中,确保您有一个“BaseTheme”和一个“AppTheme”。例如:

<resources>
    <style name="BaseTheme" parent="Theme.AppCompat">
        <!-- [...] -->
    </style>

    <style name="AppTheme" parent="BaseTheme" />
</resources>

然后,在values-v31/styles.xml和更高版本(例如v32)中,通过添加以下项扩展“BaseTheme”:

<resources>
    <style name="AppTheme" parent="BaseTheme">
        <item name="android:windowSplashScreenAnimatedIcon">@android:color/transparent</item>
        <item name="android:windowSplashScreenAnimationDuration">0</item>
    </style>
</resources>

那样的话,默认启动画面将是空白的,背景颜色从“BaseTheme”继承。

0

默认的启动画面只有在应用程序绘制第一帧时才可见。您可以尝试缩短应用程序的启动时间,以防止启动画面的出现。

禁用默认的启动画面是不可能的,但您可以应用补丁来防止其出现,并显示自己的旧定制启动画面。

  1. 自定义启动画面,使其透明:

    <style name="Theme.App.Starting" parent="Theme.SplashScreen">
        <item name="windowSplashScreenBackground">@color/transparent</item>
        <item name="windowSplashScreenAnimatedIcon">@drawable/transparent</item>
        <item name="postSplashScreenTheme">@style/AppTheme</item>
    </style>
    

    在这里,您需要在postSplashScreenTheme中设置您的应用程序主题。

  2. 将启动画面主题添加到您的启动器活动中:

    <activity android:theme="@style/Theme.App.Starting">
    
  3. 在onCreate方法的super.onCreate之前,在您的启动器活动中安装启动画面:

    SplashScreen.installSplashScreen(this);
    

完成!

注意:我在应用程序级别使用AppTheme,并仅在启动器活动中添加透明主题。还在闪屏屏幕主题中使用postSplashScreenTheme属性添加AppTheme。


-1
在你的启动主题中添加 "android:windowSplashScreenAnimatedIcon"。
<style name="SplashTheme" parent="AppMaterialTheme">
    <item name="android:windowBackground">@drawable/bg_splash</item>
    <item name="android:windowSplashScreenAnimatedIcon">@android:color/transparent</item>

并将其应用于您的 Splash 活动

<activity
        android:name=".view.ui.splash.SplashActivity"
        android:enabled="true"
        android:exported="true"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接