应用程序小部件更新TextView

3

我一直在跟随一个制作Android应用小部件的教程,但遇到了一些困难。教程让我创建了这段代码:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int [] appWidgetIds) {
    Timer timer = new Timer();
    timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 1000);
}

private class MyTime extends TimerTask {

    RemoteViews remoteViews;
    AppWidgetManager appWidgetManager;
    ComponentName thisWidget;
    DateFormat format = SimpleDateFormat.getTimeInstance(SimpleDateFormat.MEDIUM, Locale.getDefault());

    public MyTime(Context context, AppWidgetManager appWidgetManager) {
        this.appWidgetManager = appWidgetManager;
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
        thisWidget = new ComponentName(context, FlipWidget.class);
    }

    @Override
    public void run() {
        remoteViews.setTextViewText(R.id.widget_text, "Time: "+format.format(new Date()));
        appWidgetManager.updateAppWidget(thisWidget, remoteViews);
    }
}

但似乎 run 方法从未被调用,因为 TextView 从未改变。感谢您的帮助,我想掌握应用程序小部件。

Nick

1个回答

3
首先,你不能使用Timer。一旦onUpdate()返回,你的AppWidgetProviderTimer将被垃圾回收。
其次,请不要每秒更新一个应用程序小部件。之所以android:updatePeriodMillis有30分钟的最小值是因为向应用程序小部件推送更新是一项昂贵的操作。每秒更新一个小部件不仅会强制使你的“更新应用程序小部件”代码实际上常驻内存并一直运行,而且还会极大地消耗用户的电量。
对于应用程序小部件的定期更新,要么使用android:updatePeriodMillis,要么使用AlarmManager

好的,感谢您的帮助。时钟需要每秒更新,但是AlarmManager会让我以更省电的方式实现吗? - Nick
@Nick:不要将时钟实现为应用程序小部件。时钟是主屏幕的一个功能,或者是其他某些活动的功能(例如,闹钟应用程序)。 - CommonsWare
所以我不扩展AppWidgetProvider。那么,时钟小部件是如何工作的,现在我该从哪里开始? - Nick
2
@Nick:主屏幕上那些每秒钟更新一次的时钟小部件对电池非常不好,没有例外。您可以编写一个普通的Android应用程序,它具有每秒钟更新一次的时钟,特别是使用postDelayed()进行定时。您可以编写一个具有内置时钟的主屏幕应用程序。您可以编写一个使用AlarmManager每分钟更新一次的小部件。没有任何阻止您创建每秒钟更新一次的时钟小部件- 只是您在说您讨厌您的用户。 - CommonsWare
@Nick:你为AlarmManager定期闹钟提供了起始时间。因此,你将起始时间设置为5:33:00,周期设置为每分钟一次。这样就可以得到相当接近的效果。 - CommonsWare
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接