使用远程服务中的数据刷新简单的 Android Home Widget 的最佳方法是啥?

Posted

技术标签:

【中文标题】使用远程服务中的数据刷新简单的 Android Home Widget 的最佳方法是啥?【英文标题】:What is the best way to refresh the simple Android Home Widget with data from Remote Service?使用远程服务中的数据刷新简单的 Android Home Widget 的最佳方法是什么? 【发布时间】:2013-07-05 08:05:53 【问题描述】:

我正在尝试创建一个基于 LinearLayout 的小部件,该小部件每隔几分钟就会用股票代码和价格刷新一次(由用户在配置活动中配置)。

这是我遵循的步骤:

1) 在单独的进程中创建远程服务(我已经测试了该服务并且工作正常) 2) 按照下面的代码 sn-p 实现 Widget。

我的问题是,应该如何设计从远程服务来的数据中刷新自身的 Widget

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

(2)我是否应该简单地在我的应用程序小部件中声明自定义广播过滤器(因为它本质上是一个 BroadCastReceiver)并覆盖 onReceive 并从从远程服务接收到的意图的额外内容中发布数据(我的远程服务可以每 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】:
    在小部件类中实现 LocalService 在 Widget 类中实现 TimerTask 从 TimerTask 的 run() 方法启动 LocalService Lo​​calService 将通过从远程服务获取数据来刷新小部件视图

【讨论】:

以上是关于使用远程服务中的数据刷新简单的 Android Home Widget 的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

片段中的Android ListView - 获取新数据后刷新表的问题

想要在不刷新 Activity 的情况下更新 Android 中的 Listview

Android service ( 二) 远程服务

具有远程数据的 android 应用程序的最佳方法是啥?

无法从android中的远程ubuntu tomcat服务器连接mysql数据库

在 Android Studio 中刷新远程 Git 分支