我试图弄清楚如何在AppWidgetProvider中使用Greenbot Eventbus库。我已经尝试了以下方法,但不起作用:
public class SimpleWidgetProvider extends AppWidgetProvider {
RemoteViews remoteViews;
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int count = appWidgetIds.length;
for (int i = 0; i < count; i++) {
int widgetId = appWidgetIds[i];
remoteViews = new RemoteViews(context.getPackageName(), R.layout.simple_widget);
//set image
remoteViews.setImageViewResource(R.id.piggy_bank, R.drawable.piggy_bank);
Intent intent = new Intent(context, SimpleWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,
0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//set refresh button
remoteViews.setOnClickPendingIntent(R.id.refresh_btn, pendingIntent);
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
EventBus.getDefault().register(this);
}
//set total price
@Subscribe
public void onPriceEvent(TotalPriceEvent event) {
double price = event.totalPrice;
remoteViews.setTextViewText(R.id.total_amount, String.valueOf(price));
}
@Override
public void onDisabled(Context context) {
EventBus.getDefault().unregister(this);
super.onDisabled(context);
}
}
请让我知道是否需要附加更多代码。
最佳答案
AppWidgetProvider
只是具有专用BroadcastReceiver
方法的onReceive()
,该方法根据操作将广播委派给其他方法。清单注册的BroadcastReceiver
实例的寿命并不长。它们运行了足够长的时间来处理广播,然后消失,因此,将其订阅到事件总线将无法按预期工作,并且鉴于重叠的模式,这毫无意义。如果您想通知SimpleWidgetProvider
某些信息,只需向其发送广播。
例如,我们为SimpleWidgetProvider
类定义自己的动作,并在onReceive()
方法中进行检查。如果属于我们,我们将根据需要进行处理,否则调用super
方法以允许AppWidgetProvider
正确委派它。
public class SimpleWidgetProvider extends AppWidgetProvider {
public static final String MY_SPECIAL_ACTION = "com.mycompany.myapp.SPECIAL_ACTION";
@Override
public void onReceive(Context context, Intent intent) {
if(MY_SPECIAL_ACTION.equals(intent.getAction())) {
// Do your thing
}
else {
// Not our action, so let AppWidgetProvider handle it
super.onReceive(context, intent);
}
}
...
}
我们可以使用通常的机制向其发送广播。
Intent widgetNotify = new Intent(context, SimpleWidgetProvider.class);
widgetNotify.setAction(SimpleWidgetProvider.MY_SPECIAL_ACTION);
widgetNotify.putExtra(...);
...
context.sendBroadcast(widgetNotify);
我还要提到
super
和onEnabled()
中的onDisabled()
调用是不必要的,因为这些方法在AppWidgetProvider
中为空。