title: Button click does not start Service in Android App Widget
body: <p>I'm having trouble starting a Service to update an AppWidget that I'm creating as an exercise. I'm trying to get the latitude and longitude of spoofed location data from DDMS to display in the widget.  The widget uses a service to update the TextView, which may be slightly overkill, but I wanted to follow the template that seems to be common in AppWidgets that do more work (like the Forecast widget or the Wiktionary widget).</p>
  
  <p>Right now, I'm not getting any error messages or strange behavior; nothing at all happens when the button is pressed.  I'm a bit mystified as to what might be wrong.  Could anyone out there point me in the right direction?</p>
  
  <p>Additionally, if my logic for location is faulty, I'd love recommendations on that too.  I've looked at several blogs, the Google examples, and the documentation, but I feel a little fuzzy on how it works.</p>
  
  <p>Here is the current state of the widget:</p>
  
  <pre><code>public class Widget extends AppWidgetProvider
  {
      static final String TAG = "Widget"; 
      /**
       * {@inheritDoc}
       */
      public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                          int[] appWidgetIds)
      {
          // Create an intent to launch the service
          Intent serviceIntent = new Intent(context, UpdateService.class);
  
          // PendingIntent is required for the onClickPendingIntent that actually
          // starts the service from a button click
          PendingIntent pendingServiceIntent = 
              PendingIntent.getService(context, 0, serviceIntent, 0);
  
          // Get the layout for the App Widget and attach a click listener to the
          // button
          RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.main);
          views.setOnClickPendingIntent(R.id.address_button, pendingServiceIntent);
          super.onUpdate(context, appWidgetManager, appWidgetIds);
      }
  
      // To prevent any ANR timeouts, we perform the update in a service;
      // really should have its own thread too
      public static class UpdateService extends Service
      {
          static final String TAG = "UpdateService"; 
          private LocationManager locationManager;
          private Location currentLocation;
          private double latitude;
          private double longitude;
  
          public void onStart(Intent intent, int startId)
          {
              // Get a LocationManager from the system services
              locationManager = 
                  (LocationManager) getSystemService(Context.LOCATION_SERVICE);
  
              // Register for updates from spoofed GPS
              locationManager.requestLocationUpdates("gps", 30000L, 0.0f, new LocationListener()
              {
                  @Override
                  public void onLocationChanged(Location location)
                  {
                      currentLocation = location;
                  }
  
                  @Override
                  public void onProviderDisabled(String provider) {}
  
                  @Override
                  public void onProviderEnabled(String provider) {}
  
                  @Override
                  public void onStatusChanged(String provider, int status,
                          Bundle extras) {}       
              });
              // Get the last known location from GPS
              currentLocation = 
                  locationManager.getLastKnownLocation("gps");
  
              // Build the widget update
              RemoteViews updateViews = buildUpdate(this);
  
              // Push update for this widget to the home screen
              ComponentName thisWidget = new ComponentName(this, Widget.class);
  
              // AppWidgetManager updates AppWidget state; gets information about 
              // installed AppWidget providers and other AppWidget related state 
              AppWidgetManager manager = AppWidgetManager.getInstance(this);
  
              // Updates the views based on the RemoteView returned from the
              // buildUpdate method (stored in updateViews)
              manager.updateAppWidget(thisWidget, updateViews);
          }
  
          public RemoteViews buildUpdate(Context context)
          {
              latitude = currentLocation.getLatitude();
              longitude = currentLocation.getLongitude();
              RemoteViews updateViews = 
                  new RemoteViews(context.getPackageName(), R.layout.main);
              updateViews.setTextViewText(R.id.latitude_text, "" + latitude);
              updateViews.setTextViewText(R.id.longitude_text, "" + longitude);
              return updateViews;
          }
  
          @Override
          public IBinder onBind(Intent intent) {
              // We don't need to bind to this service
              return null;
          }
      }
  
  }
  </code></pre>