Java 如何从应用程序更新小部件?

Java 如何从应用程序更新小部件?,java,android,android-appwidget,Java,Android,Android Appwidget,我有一个下载时间表并保存它的应用程序,它还定期下载对时间表的更改。我目前正在使用单例,但从设计角度来看,我觉得这很难看。由于下载量大,我需要一个集中的系统来最大限度地减少网络使用 在当前情况下,每个需要从单例更新的类首先获得该单例的一个实例,然后提供一个接口,在需要更新时调用该接口的某些方法。目前,singleton处理工作线程中的所有下载。通常我会使用从活动调用的AsyncTask,但是因为我也必须将结果发送到小部件,所以我看不到这项工作 另一种选择是使用服务。我会简单地从小部件和活动绑定到它

我有一个下载时间表并保存它的应用程序,它还定期下载对时间表的更改。我目前正在使用单例,但从设计角度来看,我觉得这很难看。由于下载量大,我需要一个集中的系统来最大限度地减少网络使用

在当前情况下,每个需要从单例更新的类首先获得该单例的一个实例,然后提供一个接口,在需要更新时调用该接口的某些方法。目前,singleton处理工作线程中的所有下载。通常我会使用从活动调用的AsyncTask,但是因为我也必须将结果发送到小部件,所以我看不到这项工作

另一种选择是使用服务。我会简单地从小部件和活动绑定到它。本例中的问题是我无法从BroadcastReceiver(AppWidgetProvider是)绑定。问题是我不能定期更新我的小部件

我的问题是:我如何(或者:我可以)设计我的应用程序,使我可以从服务中更新我的小部件(为了摆脱单例),或者有更好的方法(可能是广播接收器)

我如何(或者:我可以)设计我的应用程序,使我可以从服务中更新我的小部件(为了摆脱单例),或者有更好的方法(可能是广播接收器)

要更新应用程序小部件,请在
AppWidgetManager
上调用
updateAppWidget()
。这可以在任何时候完成,而不仅仅是通过
AppWidgetProvider

要定期更新应用程序小部件,请在应用程序小部件元数据中使用
android:updatePeriodMillis
,或者直接自己设置
AlarmManager
。在这两种情况下,您都希望将工作委派给
IntentService
,因为“下载时间表”不是您希望在主应用程序线程上执行的操作--
IntentService
为您提供一个后台线程,并在您的工作完成时自动停止,所以,除非您正在积极地工作,否则您不会占用RAM


要定期执行一般工作,请使用
AlarmManager
IntentService
。作为其工作的一部分,
IntentService可以根据需要更新应用程序小部件。

下载不必在特定时间执行,因此我将使用处理程序而不是AlarmManager。否则:谢谢,它澄清了allot@Boude:“下载不必在特定时间执行,因此我将使用处理程序而不是AlarmManager”--一旦进程终止,您的
处理程序就会消失
AlarmManager
对于定期下载是一个更好的解决方案,如果即使您的UI不在前台,也应该进行下载。下载必须在小部件可见时执行。只有当活动和小部件都不可见时,才不需要下载。我想我会在测试alpha时尝试这两种方法,并根据一些用户体验做出决定。我会非常仔细地考虑你的论点,谢谢。@Boude:如果你说的“widget”是指“app widget”,从代码的角度来看,它总是可见的。是的,如果用户将它添加到主屏幕上,情况并非总是如此。