title: How to periodically find gps location in Android
body: <p>I am writing an app that records a new gps location every ten minutes on the dot.</p>
  
  <p>I've tried location pollers, putting the location listener in a service, and putting the location listener in an activity but none of these methods work for me.</p>
  
  <p>I need a method to turn on the gps location listener 2 minutes before I begin recording my location data (to give the gps ample time to find a location or determine there is no signal). I've been doing this by using an alarm that calls my gpsActivity 2 minutes before I call my updatelocation class. My updatelocation class then takes the gpsActivity's locationmanager and extracts a location from it.</p>
  
  <p>In theory this should work but when I put it on my phone I always get bad data (accuracy is too low or no signal at all)</p>
  
  <p>If someone could help me out I would be extremely grateful.</p>
  
  <p>Thanks</p>
  
  <p>Alarm calls this class 2 mins before update location</p>
  
  <pre><code>public class GPSActivity extends Activity {
  
      public static LocationListener loc_listener = null;
      public static LocationManager locationManager = null;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
          getGPS();
      }
  
      public static void getGPS() {
          if (loc_listener == null) {
              loc_listener = new LocationListener() {
  
                  @Override
                  public void onStatusChanged(String provider, int status,
                          Bundle extras) {}
  
                  @Override
                  public void onProviderEnabled(String provider) {}
  
                  @Override
                  public void onProviderDisabled(String provider) {}
  
                  @Override
                  public void onLocationChanged(Location location) {}
              };
          }
          locationManager.requestLocationUpdates(
                  LocationManager.GPS_PROVIDER, 0, 0, loc_listener);
      }
  
      public static void killGPS() {
          if (locationManager != null &amp;&amp; loc_listener != null) {
              locationManager.removeUpdates(loc_listener);
          }
      }
  }
  </code></pre>
  
  <p>then two mins later this service is called</p>
  
  <pre><code>public class UpdateLocation extends IntentService {
  
      public static final String id = "";
      public static int retryCount = 0;
      int notificationID = 1;
      // gets the location manager from the GPSActivity
      LocationManager locationManager = GPSActivity.locationManager;
  
      @Override
      public void onDestroy() {
          super.onDestroy();
      }
  
      public UpdateLocation() {
          super("UpdateLocation");
      }
  
      @Override
      protected void onHandleIntent(Intent intent) {
          locationManager = GPSActivity.locationManager;
          SharedPreferences prefs = getSharedPreferences("Settings", 0);
          final String id = prefs.getString("ID", "");
          HttpParams httpParams = new BasicHttpParams();
          // 30seconds and it stops
          HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
          HttpConnectionParams.setSoTimeout(httpParams, 30000);
          DefaultHttpClient httpclient = new DefaultHttpClient(httpParams);
          HttpPost httpost = new HttpPost(
                  "http://iphone-radar.com/gps/gps_locations");
          JSONObject holder = new JSONObject();
          try {
              holder.put("id", id);
              Location location = getLocation();
              if (location != null &amp;&amp; (location.getAccuracy() &lt; 25)) {
                  retryCount = 0;
                  Calendar c = Calendar.getInstance();
                  SimpleDateFormat sdf = new SimpleDateFormat(
                          "hh:mmaa MM/dd/yyyy");
                  holder.put("time", sdf.format(c.getTime()));
                  holder.put("time_since_epoch",
                          System.currentTimeMillis() / 1000);
                  holder.put("lat", location.getLatitude());
                  holder.put("lon", location.getLongitude());
                  StringEntity se = new StringEntity(holder.toString());
                  httpost.setEntity(se);
                  httpost.setHeader("Accept", "application/json");
                  httpost.setHeader("Content-type", "application/json");
                  ResponseHandler responseHandler = new BasicResponseHandler();
                  String response = httpclient.execute(httpost,
                          responseHandler);
                  org.json.JSONObject obj;
                  obj = new org.json.JSONObject(response);
                  SimpleDateFormat sdf2 = new SimpleDateFormat(
                          "yyyy-MM-dd hh:mm:ssaa");
                  addHistory(
                          sdf2.format(c.getTime()),
                          "Background GPS",
                          "Latitude: "
                              + String.format("%.6g%n",
                                      location.getLatitude())
                              + "\n"
                              + "Longitude: "
                              + String.format("%.6g%n",
                                      location.getLongitude()));
                  SharedPreferences.Editor editor = prefs.edit();
                  editor.putString("LastUpdatedTime", sdf.format(c.getTime()));
                  editor.commit();
                  Intent setAlarm = new Intent(UpdateLocation.this,
                          UpdateLocation.class);
                  PendingIntent pendingIntent = PendingIntent.getService(
                          UpdateLocation.this, 0, setAlarm, 0);
                  AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
                  Calendar calendar = Calendar.getInstance();
                  calendar.setTimeInMillis(System.currentTimeMillis());
                  int UPDATE_TIME = prefs.getInt("Update_time", 10);
                  calendar.add(Calendar.MINUTE, UPDATE_TIME);
                  alarmManager.set(AlarmManager.RTC_WAKEUP,
                          calendar.getTimeInMillis(), pendingIntent);
                  // sets an alarm for the next time we need to record a
                  // location
                  GPSActivity.killGPS();
                  // turns off the gps location listener
                  Intent setAlarm2 = new Intent(UpdateLocation.this,
                          GPSActivity.class);
                  PendingIntent pendingIntent2 = PendingIntent.getService(
                          UpdateLocation.this, 0, setAlarm2, 0);
                  Calendar calendar2 = Calendar.getInstance();
                  calendar2.add(Calendar.MINUTE, UPDATE_TIME - 2);
                  alarmManager.set(AlarmManager.RTC_WAKEUP,
                          calendar2.getTimeInMillis(), pendingIntent2);
                  // sets an alarm to turn on the gpsActivity 2mins before the
                  // next time updatelocation needs to record some data
              }
          } finally {
          }
      }
  }
  </code></pre>