我应该如何更新我的小部件?

Posted

技术标签:

【中文标题】我应该如何更新我的小部件?【英文标题】: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 点更新我的小部件。这可能吗?谢谢!

【问题讨论】:

【参考方案1】:

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

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

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

    使用 AlarmMenager 并在每间隔毫秒下一次运行 Intent 使用服务并更新 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,

【讨论】:

以上是关于我应该如何更新我的小部件?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter ListView 与 List 中的小部件不会在应该更新时更新

如何更新不同大小的小部件?

如何将旧的小部件迁移到新的小部件

在 FutureBuilder 的情况下,我应该如何获得一组可滚动的小部件而不会溢出

如何使用服务来监控 Android 中的方向变化

多种小部件尺寸