I create a widget with several buttons, each of which sends its intention to the broadcast receiver. The broadcast receiver is supposed to display a Toast message based on which the button was pressed. The code now looks like this:
public class WidgetProvider extends AppWidgetProvider { @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds){ ComponentName thisWidget = new ComponentName(context, WidgetProvider.class); int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); for (int widgetId : allWidgetIds) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); // Set the text of the buttons remoteViews.setTextViewText(R.id.widgetPreset1Button, prefs.getString("widget1", "Not set")); remoteViews.setTextViewText(R.id.widgetPreset2Button, prefs.getString("widget2", "Not set")); remoteViews.setTextViewText(R.id.widgetPreset3Button, prefs.getString("widget3", "Not set")); remoteViews.setTextViewText(R.id.widgetPreset4Button, prefs.getString("widget4", "Not set")); // Register the buttons with an OnClick event Intent intent1 = new Intent("myapp.SendWidgetPreset"); intent1.putExtra("Widget", 1); PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, intent1, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widgetPreset1Button, pendingIntent1); Intent intent2 = new Intent("myapp.SendWidgetPreset"); intent2.putExtra("Widget", 2); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, intent2, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widgetPreset2Button, pendingIntent2); Intent intent3 = new Intent("myapp.SendWidgetPreset"); intent3.putExtra("Widget", 3); PendingIntent pendingIntent3 = PendingIntent.getBroadcast(context, 0, intent3, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widgetPreset3Button, pendingIntent3); Intent intent4 = new Intent("myapp.SendWidgetPreset"); intent4.putExtra("Widget", 4); PendingIntent pendingIntent4 = PendingIntent.getBroadcast(context, 0, intent4, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.widgetPreset4Button, pendingIntent4); new WidgetBroadcastReceiver(); appWidgetManager.updateAppWidget(widgetId, remoteViews); } } }
and BroadcastReceiver:
public class WidgetBroadcastReceiver extends BroadcastReceiver{ public WidgetBroadcastReceiver(){ } @Override public void onReceive(Context context, Intent arg1) { int widget = arg1.getIntExtra("Widget", -1); Toast.makeText(context, "Widget pressed: " + widget, Toast.LENGTH_SHORT).show(); } }
My problem is that Widget pressed: 4 always displayed no matter which button is pressed. If I put the four lines of intent4 , intent4.putExtra() , pendingIntent4 and remoteViews.setOnClickPendingIntent() above all other intentions, it will always say Widget pressed: 3 . In other words, whatever the last registration of intentions is, that is, the widget displayed in the Toast message.
Does anyone know why this doesn't work the way I want?