我在更新 AppWidgets 时遇到问题,并且 android 中的限制/错误的汇合正在阻止我找到解决方法。
我的应用小部件是可主题化的,因此我需要能够在运行时更新其上的图像视图(以及文本视图和意图)。我正在更新多达 9 个图像视图,但我使用的图形大小相当适中(最大 11kb png)。我通过 RemoteViews 对象推送的数据总大小应该在 100kb 以下,完全在 1mb 的限制之内。我认为屏幕上的实际可绘制资源最终会比原始 png 更大,但 10% 的限制似乎足以解释这一点。但是,对于某些手机和启动器,我收到“FAILED BINDER TRANSACTION”错误。
我为此找到了两种解决方案:
1)使用 setImageViewUri(调用 setImageURI)而不是 setImageViewResource 与 RemoteViews 对象,这摆脱了通过 RemoteViews 对象发送可绘制对象,而是从 URI 加载图像。解决内存错误(参见https://groups.google.com/forum/#!topic/android-developers/KKEyW6XdDvg/discussion)
2) 将应用小部件的更新分成多个 RemoteViews 调用。所以我更新了 3 个图像,调用 updateAppWidget,创建一个新的 RemoteViews 对象,更新接下来的 3 个图像,调用 updateAppWidget 等。
第一种方法的问题在于它仅适用于中等密度设备。由于 android 代码库中的错误,所有其他设备都无法正确缩放图像(请参阅错误报告:http ://code.google.com/p/android/issues/detail?id=22590 )
第二种方法的问题在于,当屏幕方向发生变化时,android 会使用它存储在某个秘密位置的最后一个 RemoteViews 调用来销毁并重新创建小部件视图。这意味着 appwidget 没有完全重绘,因为我拆分了 RemoteView 调用并且小部件最终无法使用。似乎没有可靠的方法来确定 android 何时销毁和重新创建应用程序小部件 - 服务中的 onConfigurationChanged 并不总是触发,也没有进行任何活动级别的调用(即我可以找到的 onUpdate、onReceive)。为了使小部件能够在方向更改时完全正确地重绘,我只能使用一个 RemoteViews (updateAppWidget) 调用,因此该解决方案将不起作用。
有谁知道如何解决这个问题?我想知道是否可以实现我自己的 RemoteViews,它调用了一个非错误的 setImageURI 函数(在自定义 ImageView 类中),以便正确进行缩放。似乎很多工作只是更新了一些小部件,我不确定 android 是否会让我以这种方式扩展 RemoteViews/ImageView。
当屏幕方向改变并强制它重绘整个小部件时,是否有拦截android?
希望听到任何其他建议或解决方法的想法!谢谢。