3

我在更新 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?

希望听到任何其他建议或解决方法的想法!谢谢。

4

1 回答 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 中了解有关该服务的更多信息。

于 2013-04-26T13:35:01.990 回答