Android Tutorial StateManager - Helps managing Android applications settings and state

Status
Not open for further replies.
Edit: StateManager was written in 2011. I don't recommend using it for new projects. Use B4XPages + KVS2 instead.

StateManager is a code module which takes care of handling the application UI state and settings.

Settings
Settings are the application configurable settings. These settings should be permanently kept.

The methods for handling settings are pretty simple:
StateManager.GetSetting (Key As String) As String: gets the value associated with the given key. An empty string will return if the key is not available. The settings will be loaded from a file if they were not loaded before.

StateManager.GetSetting2 (Key As String, DefaultValue As String) As String: similar to GetSetting. The DefaultValue will return if the key was not found.

StateManager.SetSetting(Key As String, Value As String): Associates the given value with the gives key. Note that there is no need to call SaveSettings after each call to SetSetting.

StateManager.SaveSettings: saves the settings to a file. Usually you will want to call this method in Activity_Pause.

UI State
The UI state is a bit more interesting. In some cases Android may destroy our activity and then recreate it when needed. This happens for example when the user changes the screen orientation. If the user has entered some text in an EditText view then we want to keep this text. So instead of resetting the UI we are first saving the state and then we will restore it.

Not all the elements are saved. Only elements which the user interacts with (like EditText text, Spinner chosen item, SeekBar value...).
Using StateManager to handle the state is simple:
B4X:
Sub Activity_Create(FirstTime As Boolean)

    ...
    'Load the previous state
    If StateManager.RestoreState(Activity, "Main", 60) = False Then
        'set the default values
        EditText1.Text = "Default text"
        EditText2.Text = "Default text"
    End If
End Sub

Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed Then
        StateManager.ResetState("Main")
    Else
        StateManager.SaveState(Activity, "Main")
    End If
    StateManager.SaveSettings
End Sub
When the activity is paused we check if the user chose to close the activity (by pressing on the Back key). In that case we reset the state. The string parameter is the ActivityName value. StateManager can manage the state of multiple activities so the name is used to differentiate between the activities.
If UserClosed=False then we want to save the state.
The settings are saved in both cases.

When the activity is created we call: StateManager.RestoreState. The last parameter is the validity period for this state. The state will not be loaded if more than the specified minutes have passed. Pass 0 for an unlimited period.
RestoreState returns a boolean value. It returns true if the state was loaded. If the state wasn't loaded it is your responsibility to set the default value. This will be the case when the user runs the application for the first time.

To use StateManager you should choose Project - Add Existing Module and add StateManager.bas which is included in the attached example. You should also add a reference to the RandomAccessFile library and Reflection library.

statemanager_1.png


Version 1.11 is attached. It adds support for saving and restoring TabHost views with their internal views.
 

Attachments

  • StateManager.zip
    11.7 KB · Views: 1,699
Last edited:

padvou

Active Member
Licensed User
Longtime User
I will try and use labels to store values so that when state manager restores them I will re-read them and restore other things, like queries, etc. Unless of course there's some other way.. :sign0104:
I tried to add labels to the statemanager code, but i kept getting an index out of bounds exception.. :BangHead:
Could you help me with this please?
 

padvou

Active Member
Licensed User
Longtime User
StateManager also allows you to store settings. See the tutorial (first post).

I took a look, but i can't seem to get it...
I mean I 'd like to store variables. Is this possible?
Also, when i restore a text value to an autocompleteedittext, it shows the list with the record according to the text restored, exactly as if I typed it and the had to choose it. Any ideas?
 

padvou

Active Member
Licensed User
Longtime User
You can store any value you like with StateManager. See the example.


Do you want to close the drop down list?

Yes please! :sign0188:
About the example... I 'll take another look, but I must be missing something..
 

padvou

Active Member
Licensed User
Longtime User
Could you please help me out as to where exactly this snippet should be placed?

Is it correct this way:
If StateManager.RestoreState(Activity, "OrderEntry", 1) = False Then
'set the default values
'EditText1.Text = "Default text"
'EditText2.Text = "Default text"
Else
Custselector.DismissDropDown
End If
 

padvou

Active Member
Licensed User
Longtime User
Try it. Seems to be correct. Though nothing will happen if you call it in any case.

Seems to work...
Could you also please show me a brief example on how to store variable values?
 

padvou

Active Member
Licensed User
Longtime User
B4X:
StateManager.SetSetting("SomeKey", x)

if i have
Dim CustomerEmail As String

in Globals
will this be: StateManager.SetSetting("CustomerEmail", [email protected]l)
or StateManager.SetSetting("[email protected]", CustomerEmail)
Sorry for still not getting it.. :sign0104:
Also, setsetting is for setting the value, right? I must also have a statemanager.getsetting or getsetting2 to restore? What is the difference in getsetting and getsetting2?

OK, I added StateManager.SetSetting("CustomerEmail", CustomerEmail) in the sub that makes this value, and also added CustomerEmail=StateManager.GetSetting("CustomerEmail") in Activity_Create near the end..
Could you please verify this for me?
 
Last edited:

padvou

Active Member
Licensed User
Longtime User
Good morning everyone,
I still can't get statemanager to work...
Values from various controls get mixed up with values of other controls..
It's a total mess!!
Could anyone assist me?
I have uploaded in a zip file the relevant .bas files
I've noticed that a listview returns true in if v is panel
Should this happen? Could it be relevant?
 

Attachments

  • FrameOrders8StateManager.zip
    12.9 KB · Views: 345
Last edited:

padvou

Active Member
Licensed User
Longtime User
Is there a way to clear all data statemanager has saved, when the application exits?
 
Status
Not open for further replies.
Top