应用小部件更新困扰:Binder事务失败、RemoteViews、setImageURI和方向变化

3
我在更新AppWidgets时遇到了问题,由于Android中的一些限制/错误,我无法找到解决方法。我的应用程序小部件是可主题化的,因此我需要能够在运行时更新其中的imageviews(以及textviews和intents)。我正在更新的最多有9个imageviews,但我使用的图形的大小相当适度(最大11kb的pngs)。我通过RemoteViews对象推送的数据总大小应该小于100kb,远远低于1mb的限制。我认为实际在屏幕上显示的drawable资源的大小比原始的pngs要大,但10%的限制似乎足以解释这一点。但是,对于某些手机和启动器,我会遇到“FAILED BINDER TRANSACTION”错误。我找到了两个解决方案:

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并强制整个小部件重绘?
希望听到任何其他建议或解决方法!谢谢。
1个回答

0

在开发集合的AppWidgets时,我遇到了相同的问题。很多时候会出现以下情况:

  • 旋转时,ListView完全消失;
  • 按钮监听器(实际上称为PendingIntents)停止响应;
  • 通过setImageViewResource更改图像不会得到更新;

等等。我得出了与你相同的结论:android使用存储在某个秘密位置中的最后一个RemoteViews调用来销毁和重新创建小部件视图。在承认这一点之后,问题就是对AppWidgetManager.getInstance(context).updateAppWidget()的调用进行精细定时,因为我想在告诉ListView刷新自身后禁用clickListeners(或PendingIntents)(这是调用Web服务并检索大量数据的网络操作),并希望在ListView完成加载后启用侦听器,同时保持RemoteViews完全加载以处理旋转。

我差点放弃并使用替代方法...

有没有办法在屏幕方向改变时拦截android并强制重新绘制整个小部件?

...一个服务,与AppWidget不同,可以拦截Android旋转更改。如果你已经没有其他选择了,我建议你试一试:

public class MyWidget extends AppWidgetProvider {
@Override
    public void onConfigurationChanged(Configuration newConfig)
    {
                // insert code here
    }
}

在 StackOverflow 这里了解更多关于该服务的信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接