Implementing a splash screen with Qt on Android
Showcase how to setup a splash screen with Qt for Android.
This is a simple example which demonstrates one way to show a splash screen with Qt. When the app starts, The Qt splash screen with a logo and a background color is shown for two seconds. The Qt splash screen is then faded out to show the app main view. The main view consists of a simple label and a close button.
In this example, the Android default splash screen (Since Android 12) is hidden.
This example is one of series of two similar examples demonstrating splash screen. This one uses AndroidManifest flags the other uses QML view.
Using the Qt splash screen on Android
The Qt splash screen for Android is defined in the AndroidManifest.xml. The Android project files can be created manually or using the Qt Creator template generator. To create an Android project file using the Qt Creator template generator:
- Open Projects
- Go to Build Steps subsection
- Open Build Android APK
- Select Create Templates from Application subsection
<meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/qtsplashscreen"/> <meta-data android:name="android.app.splash_screen_sticky" android:value="true"/>
In the previous snippet:
- android.app.splash_screen_drawable defines the resource file defining the Qt splash screen.
- android.app.splash_screen_sticky keeps the Qt splash screen on the screen until QNativeInterface::QAndroidApplication::hideSplashScreen() function is called.
QNativeInterface::QAndroidApplication::hideSplashScreen(2000);
Since Android 12, Android has a default splash screen. On launch, the default splash screen is shown before the first view of the application is shown. There are instructions and an API to modify it. See Android Splash screens.
By default, Android uses applications icon for the splash screen. On Qt applications this can be used as is, or modified to be used as the applications splash screen or it can be combined with Qt splash screen. To keep the launch user experience consistent between platforms, it may be needed to hide the Android splash screen. To do this, define a translucent theme that effectively hides the Android splash screen.
<?xml version="1.0" encoding="UTF-8"?> <resources> <style name="splashStartTheme"> <item name="android:windowNoTitle">true</item> <item name="android:windowDisablePreview">true</item> <item name="android:windowIsTranslucent">true</item> </style> </resources>
There is a problem though. Orientation changes stop working if we have translucent theme. This is caused by the fact that the Android view gets its orientation from the underlying view, usually this is an Application Drawer which does not change its orientation. And because the theme cannot be changed after the Activity view is set, we end up with an application stuck in one orientation.
As a workaround we can create throwaway Activity with translucent theme for the Android splash screen. As soon as possible we launch another Activity, which has all the bells and whistles our application requires.
<activity android:name=".SplashActivity" android:exported="true" android:theme="@style/splashStartTheme" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
To launch the Qt splash screen, we also need to override the Android Activity onCreate
and use an Intent to launch the QtActivity.
// Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause package io.qt.qtsplashscreeninandroid; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.util.Log; import android.content.Intent; import android.view.ViewTreeObserver; import org.qtproject.qt.android.bindings.QtActivity; public class SplashActivity extends Activity { private static final String TAG = "SplashActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Set up an OnPreDrawListener to the root view. final View content = findViewById(android.R.id.content); content.getViewTreeObserver().addOnPreDrawListener( new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { Intent intent = new Intent(SplashActivity.this, QtActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); startActivity(intent); content.getViewTreeObserver().removeOnPreDrawListener(this); finish(); return true; } }); } }
In this example the main view contains just a single view with an exit button.
// Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause import QtQuick import QtQuick.Controls Window { visible: true title: qsTr("Qt Splash Screen Example") color: "#2CDE85" Text { id: textLabel text: "First View" anchors.centerIn: parent } Button { id: closeButton anchors.horizontalCenter: parent.horizontalCenter anchors.top: textLabel.bottom anchors.topMargin: 5 background: Rectangle { color: "#00414A" radius: 2 } text: "Close" contentItem: Text { color: "#FFFFFF" text: closeButton.text horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } onClicked: { Qt.callLater(Qt.quit) } } }
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.