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 :

package com.jameselsey.domain;

import java.util.ArrayList;
import java.util.List;
import com.google.android.maps.GeoPoint;
import android.app.Application;

/**
* This is a global POJO that we attach data to which we
* want to use across the application
* @author James Elsey
*
*/
public class GlobalState extends Application
{
private String testMe;

public String getTestMe() {
return testMe;
}
public void setTestMe(String testMe) {
this.testMe = testMe;
}
}

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 :

android:name="com.jameselsey.domain.GlobalState"

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

// Set values
GlobalState gs = (GlobalState) getApplication();
gs.setTestMe("Some String");</code>

// Get values
GlobalState gs = (GlobalState) getApplication();
String s = gs.getTestMe();

And thats it! Off you go!

Converting UK Postcodes to co ordinates to use in Android

If your developing applications on Android, and are looking at using the Maps API, chances are you are going to want to plot items on the map, and in order to do that you need to know the longtitude and latitude of the location you wish to mark.

I’ll assume that you already have a solid base to work from, as in a working Android application with a MapView enabled.

To locate an item on the map you need to use a GeoPoint, example below

private float longtitude;
private float latitude;
GeoPoint p = new GeoPoint((int)(latitude * 1E6), (int)(longtitudel * 1E6));

Notice the usage of float values, the easiest way of getting from a postcode to a co ordinate is to obtain the longtitude and latitude values from a conversion website, and then to add it to the above forumla. The reason being is because it is incredibly difficult to find the int values of a co ordinates, so it is easier to get a float value and convert

In brief, do the following

  1. Go to MyGeoPosition.com and enter your postcode
  2. From the URLs it generates, take the longtitude and latitude values, then enter them in the above float variables
  3. Generate your GeoPoint using the above formula
  4. Start plotting!