我应该如何更新我的小部件?
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 中的小部件不会在应该更新时更新