summaryrefslogtreecommitdiffstats
path: root/src/android/java
diff options
context:
space:
mode:
authorSamuel Mira <samuel.mira@qt.io>2022-04-20 16:08:36 +0300
committerSamuel Mira <samuel.mira@qt.io>2022-04-27 19:55:33 +0000
commit5fd6704091febcc4abbc8d7ce06a393572524fa5 (patch)
tree0b31e9bf8849ce2f02fa0270b72d6edc70edebe3 /src/android/java
parent41d217829cc1c34ae7c2fee92316a91a77018f00 (diff)
Fix restart QtActivity
Previously, a restart of QtActivity on Android would make the application fail with a blank screen. That happened because the QtActivity tried to reload the whole application and failed. With this patch, the QtActivity detects if the application is restarting by checking if QtNative and QtActivityDelegate are live and updates the connections on those objects accordingly. It allows the application to continue as before. In case that is not possible, the QtActivity will restart the application. Fixes: QTBUG-38971 Fixes: QTBUG-102298 Pick-to: 5.15 6.2 6.3 Change-Id: Id500d20b185d57b39d45d34eeaa99745a3c2b95b Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Diffstat (limited to 'src/android/java')
-rw-r--r--src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java
index 9251eba5d2..7683aa5f34 100644
--- a/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java
+++ b/src/android/java/src/org/qtproject/qt/android/bindings/QtActivityLoader.java
@@ -47,6 +47,7 @@ import android.os.Build;
import android.os.Bundle;
import android.view.Window;
+import org.qtproject.qt.android.QtNative;
import java.lang.reflect.Field;
@@ -113,9 +114,20 @@ public class QtActivityLoader extends QtLoader {
}
m_activity.requestWindowFeature(Window.FEATURE_ACTION_BAR);
+ if (QtNative.isStarted()) {
+ boolean updated = QtNative.activityDelegate().updateActivity(m_activity);
+ if (!updated) {
+ // could not update the activity so restart the application
+ Intent intent = Intent.makeRestartActivityTask(m_activity.getComponentName());
+ m_activity.startActivity(intent);
+ QtNative.quitApp();
+ Runtime.getRuntime().exit(0);
+ }
+
+ // there can only be a valid delegate object if the QtNative was started.
+ if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null)
+ QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState);
- if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) {
- QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState);
return;
}
@@ -124,15 +136,14 @@ public class QtActivityLoader extends QtLoader {
ENVIRONMENT_VARIABLES += "\tQT_ANDROID_THEME=" + QT_ANDROID_DEFAULT_THEME
+ "/\tQT_ANDROID_THEME_DISPLAY_DPI=" + m_displayDensity + "\t";
- if (null == m_activity.getLastNonConfigurationInstance()) {
- if (m_contextInfo.metaData.containsKey("android.app.background_running")
- && m_contextInfo.metaData.getBoolean("android.app.background_running")) {
- ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=0\t";
- } else {
- ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t";
- }
-
- startApp(true);
+ if (m_contextInfo.metaData.containsKey("android.app.background_running")
+ && m_contextInfo.metaData.getBoolean("android.app.background_running")) {
+ ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=0\t";
+ } else {
+ ENVIRONMENT_VARIABLES += "QT_BLOCK_EVENT_LOOPS_WHEN_SUSPENDED=1\t";
}
+
+ startApp(true);
+
}
}