diff options
author | Samuel Mira <samuel.mira@qt.io> | 2022-06-07 12:36:53 +0300 |
---|---|---|
committer | Samuel Mira <samuel.mira@qt.io> | 2022-06-07 15:29:09 +0300 |
commit | 04ec9c5593f0ac067dd39ccfca65c768419dc1fd (patch) | |
tree | 2cbb09dd56a30e4cfaa55ba40cf275dbfe272ee1 /src/android/java/src/org | |
parent | 48243144f46d91c97379a19afbb3d190514609de (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
Change-Id: Id500d20b185d57b39d45d34eeaa99745a3c2b95b
Reviewed-by: Ivan Solovev <ivan.solovev@qt.io>
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
(cherry picked from commit 5fd6704091febcc4abbc8d7ce06a393572524fa5)
Diffstat (limited to 'src/android/java/src/org')
-rw-r--r-- | src/android/java/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java index c3074c353e..4ebdca9700 100644 --- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java +++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivityLoader.java @@ -140,8 +140,20 @@ public class QtActivityLoader extends QtLoader { m_activity.requestWindowFeature(Window.FEATURE_ACTION_BAR); - if (QtApplication.m_delegateObject != null && QtApplication.onCreate != null) { - QtApplication.invokeDelegateMethod(QtApplication.onCreate, savedInstanceState); + 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); + return; } @@ -150,20 +162,20 @@ 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"; - } - if (m_contextInfo.metaData.containsKey("android.app.auto_screen_scale_factor") - && m_contextInfo.metaData.getBoolean("android.app.auto_screen_scale_factor")) { - ENVIRONMENT_VARIABLES += "QT_AUTO_SCREEN_SCALE_FACTOR=1\t"; - } + 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("androi.app.auto_screen_scale_factor") + && m_contextInfo.metaData.getBoolean("android.app.auto_screen_scale_factor")) { + ENVIRONMENT_VARIABLES += "QT_AUTO_SCREEN_SCALE_FACTOR=1\t"; } + + startApp(true); + } } |