我通过在构建更新小部件的意图中添加额外内容来实现此目的。此外,当小部件拥有信息时,可以再次将其传递到填充小部件视图的 RemoteViewsService 中
在我的 UpdateWidget 帮助器方法中,我传入 userId (由应用程序中的各种活动调用,可能需要通知小部件它需要自行更新)。
public static void updateWorkoutsWidget(Context context) {
Intent intent = new Intent(context, WorkoutsWidget.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(WorkoutsWidgetService.USER_ID_EXTRA, userId);
int[] ids = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, WorkoutsWidget.class));
if(ids != null && ids.length > 0) {
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
context.sendBroadcast(intent);
}
然后小部件有一个字段来保存 userId 并在 onReceive 中更新它。我将其与用于创建收集适配器的 Intent 一起传递到 RemoteViewsService 中。
public class WorkoutsWidget extends AppWidgetProvider {
private long userId;
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getLongExtra(WorkoutsWidgetService.USER_ID_EXTRA, -1) != -1) {
userId = intent.getLongExtra(WorkoutsWidgetService.USER_ID_EXTRA, -1);
}
super.onReceive(context, intent);
}
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// update each of the app widgets with the remote adapter
for (Integer widgetId : appWidgetIds) {
Intent intent = new Intent(context, WorkoutsWidgetService.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
intent.putExtra(WorkoutsWidgetService.USER_ID_EXTRA, userId);
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_workouts);
rv.setRemoteAdapter(R.id.workouts_list, intent);
rv.setEmptyView(R.id.workouts_list, R.id.empty_view);
//(Pending intent stuff ommitted for brrevity)
appWidgetManager.updateAppWidget(widgetId, rv);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}
然后所有这些最终都会直接通过 RemoteViewsService 传递到其 RemoteViewsFactory 中:
public class WorkoutsWidgetService extends RemoteViewsService {
public static final String TRACK_WORKOUT_ACTION = "com.bodybuilding.mobile.service.TRACK_WORKOUT_ACTION";
public static final String USER_ID_EXTRA = "userId";
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
return new WorkoutWidgetViewsFactory(this.getApplicationContext(), intent);
}
class WorkoutWidgetViewsFactory implements RemoteViewsFactory, ServiceConnection {
WorkoutWidgetViewsFactory(Context context, Intent intent) {
this.context = context;
appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
userId = intent.getLongExtra(USER_ID_EXTRA, -1);
}
//Lots of other stuff in here
}
}