0

私は LinearLayout ベースのウィジェットを作成しようとしています。これは、数分ごとに株式ティッカー シンボルと価格で更新されます (構成アクティビティでユーザーが構成可能)。

私が従う手順は次のとおりです。

1)別のプロセスでリモートサービスを作成します(サービスをテストし、正常に動作します) 2)以下のコードスニペットに従ってウィジェットを実装します。

私の質問は、リモート サービスからのデータから自身を更新するウィジェットをどのように設計する必要があるかということです。

(1) 以下のアプローチを使用する - TimerTask からリモート サービスを開始/バインドし、数分ごとにウィジェットを更新します (テスト目的でのみ、または 5 秒ごとにテストしようとしています....我慢してください ....動作しませんところで)

(2)アプリウィジェットでカスタムブロードキャストフィルターを宣言するだけで(本質的にBroadCastReceiverであるため)、onReceiveをオーバーライドし、リモートサービスから受信したインテントからのエクストラからデータを公開する必要があります(マイリモートサービスは、0ごとにカスタムインテントをブロードキャストできます2番目)

利用可能な最良のオプションは何ですか? 誰かが私のような同様の問題を抱えているシナリオの例を検索しようとしましたが、多くの情報を見つけることができませんでした.

ここに私のウィジェットのコードがあります -

// Author - Anand M
public class TestWidget extends AppWidgetProvider {

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

        for (int i = 0; i < N; i++) {
            // We have only one widget on Home Screen
            int appWidgetId = appWidgetIds[i];
            timer.scheduleAtFixedRate(new MyRefreshTimer(context, appWidgetManager, appWidgetId), 3000, 5000);
        }
    }

    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        Log.d(LOGTAG, "onDeleted");

        timer.cancel();
        timer = null;
    }

    @Override
    public void onEnabled(Context context) {
        Log.d(LOGTAG, "onEnabled");

    }

    @Override
    public void onDisabled(Context context) {
        Log.d(LOGTAG, "onDisabled");
    }

    private class MyRefreshTimer extends TimerTask {
        // Remote Service Interface declaration
        // Connection to Remote Service

        public MyRefreshTimer() {

            // Initialize it here
            // Start and Bind to Remote Service


        }

        public void run() {

            // get data from Remote Service 
            // if the data received is not null then Push it to this widget 
            ComponentName thisWidget = new ComponentName(_ctx, TestWidget.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(_ctx);
            manager.updateAppWidget(thisWidget, remoteViews);

            Intent myWidgetIntent = new Intent(_ctx, TestWidget.class);
            myWidgetIntent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
            _ctx.sendBroadcast(myWidgetIntent);

        }

    }
}

追加情報 :

(1)widget_provider レイアウトを宣言しましたが、

(2) widget_provider_info レイアウト

(3) ウィジェットをレシーバーとして宣言しました (ドキュメントに従って: URL:http://developer.android.com/guide/topics/appwidgets )。

4

1 に答える 1

0
  1. ウィジェット クラスに LocalService を実装する
  2. Widget クラスに TimerTask を実装する
  3. TimerTask の run() メソッドから LocalService を起動
  4. LocalService は、リモート サービスからデータをフェッチしてウィジェット ビューを更新します。
于 2013-07-13T19:29:25.460 に答える