Button click does not start Service in Android App Widget
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 commo开发者_StackOverflow社区n in AppWidgets that do more work (like the Forecast widget or the Wiktionary widget).
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?
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.
Here is the current state of the widget:
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;
}
}
}
Try setting the last parameter of
PendingIntent.getService(context, 0, serviceIntent, 0);
to:
PendingIntent.getService(context, 0, serviceIntent, Intent.FLAG_ACTIVITY_NEW_TASK);
Also sometimes you need to addData to your intent for Android to distinguish it as something new, this is a bit hacky but seems to work so add:
serviceIntent.setData(Uri.parse("uri::somethingrandomandunique");
PendingIntent pendingIntent = PendingIntent.getService(context, 0, startServiceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.start_service_btn_widget, pendingIntent);
appWidgetManager.updateAppWidget
must be call , or click event won't response
appWidgetManager.updateAppWidget(componentName, remoteViews);
精彩评论