How do I click on my widget to execute a certain code?

The widget is just 1 image, when you click on which a certain code is executed, you do not need to call an Activity.

  • what kind of widget are we talking about - the widget of the working screen (App Widget) or the widget of the application, like Button, TextView - pavlofff
  • @pavlofff desktop screen widget - Depish

1 answer 1

Processing clicks on the widget is done through PendingIntent'ы .

AndroidManifest.xml

 <receiver android:name=".widget.Widget" android:enabled="true"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/> <action android:name="ru.ztrap.FORCE_WIDGET_UPDATE"/> <action android:name="ru.ztrap.STOP_WIDGET_ANIMATION"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget_info"/> </receiver> 

Widget.java

 public class Widget extends AppWidgetProvider { public final static String STOP_WIDGET_ANIMATION = "ru.ztrap.STOP_WIDGET_ANIMATION"; public final static String FORCE_WIDGET_UPDATE = "ru.ztrap.FORCE_WIDGET_UPDATE"; @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int id : appWidgetIds) { updateWidget(context, appWidgetManager, id); } } //вызывается каждый раз, при отлове broadcast'a с установленным для виджета фильтром @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); //Проверка action и при соответствии - выполнение вашего кода if (FORCE_WIDGET_UPDATE.equals(intent.getAction())) { int widgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); int[] allWidgetIds = { widgetID }; Intent i = new Intent(context, YourService.class); i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); context.startService(i); } if (STOP_WIDGET_ANIMATION.equals(intent.getAction())) { // обновляете виджет после обновления данных } } private void updateWidget(Context context, AppWidgetManager appWidgetManager, int widgetID) { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget); Intent updateIntent = new Intent(context, Widget.class); updateIntent.setAction(FORCE_WIDGET_UPDATE); updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID); // id виджета, который от которого будет послан broadcast int[] allWidgetIds = {widgetID}; // id виджетов, которые необходимо будет обновить updateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); PendingIntent pIntent = PendingIntent.getBroadcast(context, widgetID, updateIntent, 0); // создаём PendingIntent который будет отправляться при нажатии views.setOnClickPendingIntent(R.id.refresh, pIntent); // id кнопки, по нажатию на которую будет отправлен broadcast appWidgetManager.updateAppWidget(widgetID, views); } } 

YourService.java

 public class YourService extends IntentService { public YourService() { super("YourService"); } @Override protected void onHandleIntent(Intent intent) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); ComponentName thisWidget = new ComponentName(this, Widget.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); Integer[] allWidgetIds = intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); if (allWidgetIds == null) allWidgetIds = appWidgetIds; for (int widgetID : allWidgetIds) { // здесь делаете то, что вам нужно, после чего отправляете broadcast (если после этих действий вам нужно обновить виджет) Intent i = new Intent(Widget.STOP_WIDGET_ANIMATION); i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetID); sendBroadcast(i); } } }