[Interest] QML Settings fails persistance on Android

René Hansen renehh at gmail.com
Fri Aug 31 13:26:05 CEST 2018


Hi,


I've run into a number of weird cases where properties on a *Settings*
element doesn't properly persist between launches of an app.

Initially I used aliasing quite heavily for it's syntactic ease, as per the
main example from the docs. However, I found that sometimes only part of
the the properties would properly persist for next launch. I could never
quite reproduce the issues consistently and it had a sort of
race-condition'y feel about it. So I gave up an aliases.

Instead I've opted for a direct one-way load binding on launch and then a
write-back to the Settings when the app closes down. This seems to work
correctly regarding value persistence. That is, when it actually works...

Here's the pickle; Android has two means of closing an application. One is,
that you can directly exit it via the back button, which triggers a Close
event on the main window, the other is by suspending the app and then
"clearing" it out from the list of background processes.

The former produces a valid result, where properties are properly persisted
to the *Settings*, the other does not.

I'm guessing this is because the actual write-back happens on the
destruction of the Settings element, which is, afaict, never triggered if
the app is cleared during suspension.

I've made a futile attempt at manually triggering the write-back, at an
earlier stage of the shutdown, by connecting the the *application.state*,
e.g.:

*  Connections {*
*    target: Qt.application*
*    onStateChanged: {*
*      switch(Qt.application.state) {*
*      case Qt.ApplicationActive:*
*        console.log("Qt.ApplicationActive")*
*        break;*
*      case Qt.ApplicationInactive:*
*        console.log("Qt.ApplicationInactive")*
*        break;*
*      case Qt.ApplicationSuspended:*
*        console.log("Qt.ApplicationSuspended")*

*        // WRITE STUFF TO SETTINGS HERE*

*        break;*
*      case Qt.ApplicationHidden:*
*        console.log("Qt.ApplicationHidden")*
*        break;*
*      }*
*    }*
*  }*

However, even by doing it this way, "seemingly" before the app is
suspended, the values are still not written back at all. Presumably it's
because of missing destruction trigger mentioned above.

So, what are my options here if I'd like to use *Settings* here?

I notice QSettings have a sync
<http://doc.qt.io/qt-5/qsettings.html#sync> method,
but I don't see anything similar for the QML variant.

What is the canonical way to solve this problem for Android? Has anyone
else done this in a practical manner?


Best regards,

René Hansen
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20180831/7221e123/attachment.html>


More information about the Interest mailing list