我有一个应用程序可以下载时间表并保存它,它还定期下载对此时间表的更改。我目前正在使用单例,但从设计角度来看我发现这很丑陋。由于下载量很大,我需要一个集中式系统来最大限度地减少网络使用。
在当前情况下,每个需要从单例更新的类首先获取该单例的实例,然后提供一个接口(interface),在需要更新时调用该接口(interface)的某些方法。目前,单例处理工作线程中的所有下载。通常我会使用从 Activity 调用的 AsyncTask,但是因为我也必须将结果发送到小部件,所以我看不到这项工作。
另一种方法是使用服务。我只需从小部件和 Activity 中绑定(bind)到它即可。这种情况下的问题是我无法从 BroadcastReceiver(AppWidgetProvider 就是)进行绑定(bind)。问题是我无法定期更新我的小部件。
我的问题是:我如何(或者:我可以)设计我的应用程序,以便我可以从服务更新我的小部件(为了摆脱单例)或者是否有更好的方法(也许广播接收器)?
最佳答案
how can I (or: can I) design my app in such a way that I can update my widget from a service (in order to get rid of the singleton) or is there a better way (maybe BroadcastReceivers)?
要更新应用小部件,请在 AppWidgetManager
上调用 updateAppWidget()
。这可以在任何时候完成,而不仅仅是通过 AppWidgetProvider
。
要定期更新应用小部件,请在应用小部件元数据中使用 android:updatePeriodMillis
,或者直接自行设置 AlarmManager
。无论哪种情况,您都希望将工作委托(delegate)给 IntentService
,因为“下载时间表”不是您想要在主应用程序线程上执行的操作 -- IntentService
为您提供一个后台线程,并在您的工作完成时自动停止,因此除非您正在积极工作,否则您不会占用 RAM。
要定期执行一般工作,请使用 AlarmManager
和 IntentService
。作为其工作的一部分,IntentService
可以根据需要更新应用程序小部件。
关于java - 如何从应用程序更新小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777455/