【问题标题】:How to use Eventbus in a widget?如何在小部件中使用 Eventbus?
【发布时间】:2016-09-17 10:43:23
【问题描述】:

我试图弄清楚如何在我的 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);
    }
}

如果我需要附加更多代码,请告诉我。

【问题讨论】:

    标签: android widget greenrobot-eventbus appwidgetprovider


    【解决方案1】:

    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 中是空的。

    【讨论】:

    • 无论您将TotalPriceEvent 发布到EventBus 的哪个位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多