2016-09-17 80 views
1

我想弄清楚如何在我的AppWidgetProvider中使用Greenbot Eventbus库。我试过以下,这是行不通的:如何在小部件中使用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); 
    } 
} 

请让我知道如果我需要附加更多的代码。

回答

2

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); 

我还要提到,在onEnabled()onDisabled()super电话是不必要的,因为这些方法在AppWidgetProvider空。

+0

第二段代码应该放在哪里? – Helenesh

+0

无论您将“TotalPriceEvent”发布到“EventBus”的位置。 –

相关问题