1) 使用 setImageViewUri(调用 setImageURI)而不是使用 RemoteViews 对象的 setImageViewResource,这样可以避免通过 RemoteViews 对象发送 drawable,并从 URI 加载图像。解决了内存错误问题(参见 https://groups.google.com/forum/#!topic/android-developers/KKEyW6XdDvg/discussion)
2) 将应用程序小部件的更新分为多个 RemoteViews 调用。所以我更新 3 张图片,调用 updateAppWidget,创建一个新的 RemoteViews 对象,更新下一个 3 张图片,调用 updateAppWidget,等等。
第一种方法的问题在于它仅适用于中密度设备。由于安卓代码库中的一个错误,所有其他设备都无法正确缩放图像(请参见 bug 报告:http://code.google.com/p/android/issues/detail?id=22590)
第二种方法的问题在于当屏幕方向改变时,Android会销毁并重新创建小部件视图,使用它存储在某个秘密位置中的最后一个RemoteViews调用。这意味着应用程序小部件没有被完全重绘,因为我拆分了我的RemoteView调用,导致小部件无法使用。似乎没有可靠的方法来确定Android何时销毁和重新创建应用程序小部件 - 服务中的onConfigurationChanged并不总是触发,并且我找不到任何Activity级别的调用(即onUpdate、onReceive)。为了使小部件能够在方向更改时完全正确地重绘,我只能使用一个RemoteViews(updateAppWidget)调用,因此这种解决方案行不通。有人有什么想法可以解决这个问题吗?我在想是否可以实现自己的RemoteViews,调用一个非错误的setImageURI函数(在自定义ImageView类中),以便缩放正确进行。这似乎需要很多工作才能更新几个小部件,而且我不确定Android是否允许我以这种方式扩展RemoteViews/ImageView。
有没有办法在屏幕方向改变时拦截Android并强制整个小部件重绘?
希望听到任何其他建议或解决方法!谢谢。