Monday, June 24, 2013

Android; Implementing global state; share data between Activities and across your application

If your developing an Android application, chances are you will have multiple activities that perform various tasks. One of my first questions when I was investigating Android, was how can I pass data between my Activities? Moreover, how can I retain some form of state, globally throughout my application, so I can dynamically pass data without having to persist to a datastore between Activities.
The solution; Use the applications Context
Firstly, you should create a new class that will behave as our global object, for example :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.laxman.test;
 
import java.util.ArrayList;
import java.util.List;

import android.app.Application;
 
/**
* This is a global POJO that we attach data to which we
* want to use across the application
* @author laxman
*
*/
public class GlobalInstance extends Application
{
private static String globalvariable;
 
public String getGlobalvariable {
return globalvariable;
}
public void setGlobalvariable(String globalvariable) {
this.globalvariable= globalvariable;
}
}
The above class declares one String, with accessor methods. Soon we will see how this object will be available throughout the application. You can add anything you want onto this object, in my application I have a List of other domain classes that I wanted to use elsewhere in my application.
Right, now that you have your global class defined, you need to specify this in your AndroidManifest file, otherwise the application won’t know where to find this class, and you will get a ClassNotFoundException
Locate your application tag, and add this into it :

below Tag write in AndroidManifest file inside the Application tag
1
android:name="com.laxman.test.GlobalInstance"
It must reference your fully qualified global state class
Now you have it set, your ready to start putting data in, and pulling data out, use the following
1
2
3
4
5
6
7
// Set values
GlobalInstance globalInstance= (GlobalInstance) getApplication();
globalInstance.setGlobalvariable("Some String");</code>
 
// Get values
GlobalInstance globalInstance= (GlobalInstance) getApplication();
String s = globalInstance.getGlobalvariable ();
And thats it! Off you go!