0

サービスによって更新されるウィジェットを作成しました。ただし、そのサービスによって処理されるインターフェイスは、追加時に更新されず、アプリの 2 回目の実行時に更新されます。

widgetProvider.java:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);

    for (int appWidgetId : appWidgetIds) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);

        Intent intent = new Intent(context, MetalPriceService.class);
        intent.setAction(MetalPriceService.UPDATEPRICE);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        views.setOnClickPendingIntent(R.id.widget_refresh_btn, pendingIntent);
        appWidgetManager.updateAppWidget(appWidgetId, views);

        context.startService(intent);
}

widgetPriceUpdateService.java:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onStart(intent, startId);

    try {
        updatePrice(intent); //deal with interface updating stuffs
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    stopSelf(startId);

    return START_STICKY;
}
4

1 に答える 1

0

自分自身を RemoteView にして、ウィジェットを Service で直接更新するだけです。次の方法で AppWidgetManager を取得します。

AppWidgetManager mgr=AppWidgetManager.getInstance(this);

それ以外は通常どおりです。

既存の AppWidgetProvider に作業を強制したい場合は、コンポーネントにカスタム アクションを含むブロードキャストを送信し、取得時に onReceive() から自分で onUpdate() を呼び出します。

于 2012-10-14T07:32:46.477 に答える