Я отвечаю на нажатие кнопки на моем appwidget в методе onreceive. Когда я нажимаю кнопку, я хочу заставить виджет вызвать метод onupdate. Как это сделать?
Спасибо заранее!
Я отвечаю на нажатие кнопки на моем appwidget в методе onreceive. Когда я нажимаю кнопку, я хочу заставить виджет вызвать метод onupdate. Как это сделать?
Спасибо заранее!
Виджет не может реагировать на клики, потому что это не отдельный процесс. Но он может начать обслуживание для обработки вашей команды:
public class TestWidget extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
// Create an Intent to launch UpdateService
Intent intent = new Intent(context, UpdateService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_provider_layout);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
// Tell the AppWidgetManager to perform an update on the current App Widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
}
public static class UpdateService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//process your click here
return START_NOT_STICKY;
}
}
}
Вы также должны зарегистрировать новую службу в файле манифеста:
<service android:name="com.xxx.yyy.TestWidget$UpdateService">
Вы можете найти другой пример реализации UpdateService в примере Викисловаря в SDK
И вот еще один хороший подход Clickable widgets в android
Это немного грубо, но для меня это работает довольно хорошо, поскольку я не нашел прямого способа принудительного обновления.
public class Foo extends AppWidgetManager {
public static Foo Widget = null;
public static Context context;
public static AppWidgetManager AWM;
public static int IDs[];
public void onUpdate(Context context, AppWidgetManager AWM, int IDs[]) {
if (null == context) context = Foo.context;
if (null == AWM) AWM = Foo.AWM;
if (null == IDs) IDs = Foo.IDs;
Foo.Widget = this;
Foo.context = context;
Foo.AWM = AWM;
Foo.IDs = IDs;
.......
}
}
Теперь, в любом месте, я хочу, чтобы виджет обновлялся, он прост как:
if (null != Foo.Widget) Foo.Widget.onUpdate(null, null, null);