3

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

安卓清单:

<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>

应用小部件提供程序 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 只执行一次而不是每 10 毫秒执行一次?如果我只需要在特定时间更新小部件,那么更新小部件的最佳方式是什么?假设我只需要在上午 7 点、上午 8 点和下午 3 点更新我的小部件。这可能吗?谢谢!

4

1 回答 1

1

是的,使用 10 毫秒间隔更新小部件是非常糟糕的主意。

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

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

  1. 使用 AlarmMenager 并在每间隔毫秒下一次运行 Intent
  2. 使用服务并更新 RemoteView

当您创建时钟并且需要 1 秒间隔时,第一个非常好。但是当您需要间隔 < 1 秒时,它不是上帝 - 延迟意图的问题。出于您的目的使用服务,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 ,

于 2014-04-24T20:37:42.487 回答