我该如何处理更新我的小部件?

时间:2014-03-10 17:19:14

标签: android android-widget widget onupdate

我刚创建了我的第一个小部件,一切顺利,直到我到达我应该在更新时设置的部分。这是我的代码,使我的问题清楚:

Android Manifest:

<receiver android:name="com.whizzapps.stpsurniki.widget.UrnikWidget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data 
            android:name="android.appwidget.provider"
            android:resource="@xml/app_widget_info"/>
    </receiver>

App Widget Provider XML:

<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
    android:minWidth="80dp"
    android:minHeight="40dp"
    android:updatePeriodMillis="10"
    android:initialLayout="@layout/app_widget"
    android:widgetCategory="home_screen" >
</appwidget-provider>

AppWidgetProvider类:

public class UrnikWidget extends AppWidgetProvider {

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

    Log.i("TAG", "onUpdate");
    }
}

我创建了一个带有TextView的简单小部件,其中显示了某个单词,它完全没有逻辑,因为我还在学习如何使用小部件。正如您所看到的,我创建了一个log.i来查看实际调用onUpdate的时间,我的问题是它只在我第一次将小部件放在主屏幕上时调用。

我知道10毫秒的更新间隔太低,不应该因为电池耗尽而使用,但我仅使用10毫秒进行测试。

为什么onUpdate只执行一次而不是每10ms执行一次?如果我需要在特定时间更新小部件,那么对我来说更新小部件的最佳方式是什么?假设我只需要在早上7点,早上8点和下午3点更新我的小部件。这可能吗?谢谢!

1 个答案:

答案 0 :(得分:1)

是的,以10毫秒的间隔更新小部件是非常糟糕的。

我遇到了和你一样的问题,尝试了很多不同的解决方案。

如果您想要经常更新您的小部件,有两种解决方案:

  1. 使用AlarmMenager,然后在每个间隔毫秒
  2. 下运行Intent
  3. 使用服务并更新RemoteView
  4. 当您创建时钟时,第一个非常好,您需要1秒间隔。但是当你需要间隔&lt; 1秒不是上帝 - 延迟意图的问题。 为了您的目的使用Service,RemoteView不是标准视图,prons是您可以从任何地方更新该视图,这是一个代码:

    public class WidgetService extends Service {
    
    private ScheduledExecutorService scheduleTaskExecutor;
    
    public WidgetService() {
    }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        scheduleTaskExecutor.shutdownNow();
        scheduleTaskExecutor = null;
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        scheduleTaskExecutor = Executors.newScheduledThreadPool(1);
    }
    
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
    
        final Context cx = this;
        final long startTime = SystemClock.uptimeMillis();
        scheduleTaskExecutor.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
               //logic here for example
               RemoteViews rv = new RemoteViews(this.getPackageName(), getLayoutId());
    
            }
        }, 0, 10, TimeUnit.MILLISECONDS);
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    

    }

    小心onUpdate方法有一个非常严重的错误,并且调用onUpdate方法,即使你的小部件不可见,所以android创建幻像小部件,http://code.google.com/p/android/issues/detail?id=2539