每秒定期更新小部件

Posted

技术标签:

【中文标题】每秒定期更新小部件【英文标题】:Update Widget Periodically Every Second 【发布时间】:2013-02-25 15:49:02 【问题描述】:

我目前有一个使用两个setTextViewText 的小部件:

公共类 DigitalClock 扩展 AppWidgetProvider

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
    int N = appWidgetIds.length;

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.digitalclock);

    for (int i = 0; i < N; i++) 
        int appWidgetId = appWidgetIds[i];

        Intent clockIntent = new Intent(context, DeskClock.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, clockIntent, 0);

        views.setOnClickPendingIntent(R.id.rl, pendingIntent);
        java.util.Date noteTS = Calendar.getInstance().getTime();
        String time = "kk:mm";
        String date = "dd MMMMM yyyy";

        views.setTextViewText(R.id.tvTime, DateFormat.format(time, noteTS));
        views.setTextViewText(R.id.tvDate, DateFormat.format(date, noteTS));

        appWidgetManager.updateAppWidget(appWidgetId, views);


    



我的问题是如何使用它来设置两个 TextView 每秒,以便时间更新而不是 appwidgetprovider 允许的 30 分钟? 我听说过使用AlarmManager,使用servicehandler....问题是似乎没有人说清楚或举例说明我将如何去做。

因此,如果有人有明确的方法来完成此操作,我将不胜感激,谢谢

【问题讨论】:

你真的不应该每秒更新一个应用小部件。每个应用程序小部件更新都相对昂贵,并且每秒更新一次也意味着您的进程将一直在内存中徘徊。时钟最好作为主屏幕本身的功能来实现,以提高效率。 【参考方案1】:

您可能有一些服务在后台运行。将广播消息从该服务或活动发送到扩展 AppWidgetProvider 的类(在您的情况下为 DigitalClock),然后覆盖同一类的 onReceive() 函数。

第 1 步:从服务或某处发送广播。

第 2 步:在您的 DigitalClock 类中添加 onReceive() 函数。

    public class DigitalClock extends AppWidgetProvider 


        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
        int N = appWidgetIds.length;

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.digitalclock);

        for (int i = 0; i < N; i++) 
            int appWidgetId = appWidgetIds[i];

            Intent clockIntent = new Intent(context, DeskClock.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, clockIntent, 0);

            views.setOnClickPendingIntent(R.id.rl, pendingIntent);
            java.util.Date noteTS = Calendar.getInstance().getTime();
            String time = "kk:mm";
            String date = "dd MMMMM yyyy";

            views.setTextViewText(R.id.tvTime, DateFormat.format(time, noteTS));
            views.setTextViewText(R.id.tvDate, DateFormat.format(date, noteTS));

            appWidgetManager.updateAppWidget(appWidgetId, views);


        

    
  @Override
        public void onReceive(Context context, Intent intent) 


                super.onReceive(context, intent);
//Do your task here like updating the textviews


    

【讨论】:

这种方法似乎不再适用了。 reddit.com/r/androiddev/comments/clte0i/…

以上是关于每秒定期更新小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 Activity 的数据更新小部件?

定期更新小部件 TextView 的简单方法

电池高效的 android 小部件,每分钟更新一次

使用计时器时小部件 TextView 未更新

为啥我们必须从一个小部件更新多个小部件?

如何在更新父有状态小部件时更新子有状态小部件