【问题标题】:How should I approach updating my widget?我应该如何更新我的小部件?
【发布时间】:2014-04-13 22:54:50
【问题描述】:

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

Android 清单:

<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 点更新我的小部件。这可能吗?谢谢!

【问题讨论】:

    标签: android android-widget widget onupdate


    【解决方案1】:

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

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

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

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

    第一个在创建时钟时非常好,需要 1 秒的间隔。但是,当您需要间隔

    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

    【讨论】:

      猜你喜欢
      • 2010-10-21
      • 2022-11-04
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 2021-08-05
      相关资源
      最近更新 更多