2016-09-17 11 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メソッドです。マニフェストに登録されたインスタンスBroadcastReceiverは、あまり長く生きることを意図していません。それらは放送を処理するのに十分な長さで実行されてから終了します。そのため、イベントバスに加入することは期待どおりには行かず、重複したパターンを考えると無意味です。 SimpleWidgetProviderに何かを通知したい場合は、ブロードキャストを送信してください。

たとえば、SimpleWidgetProviderクラスの独自のアクションを定義し、onReceive()メソッドでそれを確認します。それが私たちの場合は、必要に応じて処理し、それ以外の場合はメソッドを呼び出して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); 

私はまた、これらの方法はAppWidgetProviderで空になっているようonEnabled()onDisabled()super呼び出しは、不要であることを言及します。

+0

2番目のコードはどこに収まるはずですか? – Helenesh

+0

あなたは 'TotalPriceEvent'を' EventBus'に投稿していたでしょう。 –

関連する問題