使用Remote Service中的数据刷新简单Android Home Widget的最佳方法是什么?

时间:2013-07-08 04:04:53

标签: android android-widget android-service timer-jobs

我正在尝试创建一个基于LinearLayout的Widget,它会在每隔几分钟后刷新自己的股票代码和价格(可由配置活动中的用户配置)。

以下是我遵循的步骤:

1)在一个单独的过程中创建远程服务(我测试了服务并且工作正常) 2)按照以下代码片段实现Widget。

我的问题是,如何设计从远程服务数据刷新itsellf的Widget?

(1)使用我的下面的方法 - 从TimerTask开始/绑定远程服务并在每隔几分钟后更新小部件(尝试测试它或每5秒仅用于测试目的...所以请耐心等待我....不工作顺便说一句)

(2)我应该简单地在我的应用程序Widget中声明自定义广播过滤器(因为它本身就是BroadCastReceiver)并覆盖onReceive并从远程服务接收到的intent中发布数据(My Remote Service可以每0广播自定义意图)第二)

什么是最好的选择? 我试图搜索一个示例场景,其中有人遇到类似我的问题,但找不到太多信息。

这是我的小部件的代码 -

// 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)。

1 个答案:

答案 0 :(得分:0)

  1. 在窗口小部件类中实现LocalService
  2. 在Widget类中实现TimerTask
  3. 从TimerTask的run()方法启动LocalService
  4. LocalService将通过从远程服务
  5. 获取数据来刷新窗口小部件视图