android - 应用小部件更新问题 : Failed Binder Transaction, RemoteViews、setImageURI 和方向更改

标签 android orientation screen-orientation android-appwidget remoteview

我在更新 AppWidgets 时遇到问题,而 android 中的限制/错误的汇合使我无法找到解决方法。

我的应用程序小部件是可主题化的,因此我需要能够在运行时更新其上的 ImageView (以及 TextView 和 Intent )。我正在更新多达 9 个 ImageView ,但我使用的图形大小相当适中(最大 11kb png)。我通过 RemoteViews 对象推送的数据总大小应该在 100kb 以下,完全在 1mb 的限制之内。我认为屏幕上的实际可绘制资源最终会比原始 png 的尺寸大,但 10% 的限制似乎足以解释这一点。但是,对于某些手机和发射器,我收到“失败的 BINDER 交易”错误。

我找到了两种解决方案:

1) 对 RemoteViews 对象使用 setImageViewUri(它调用 setImageURI)而不是 setImageViewResource,这样可以避免通过 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 使用它存储在某个 secret 位置的最后一个 RemoteViews 调用销毁并重新创建小部件 View 。这意味着 appwidget 没有完全重绘,因为我拆分了我的 RemoteView 调用并且小部件最终无法使用。似乎没有可靠的方法来确定 android 何时销毁和重新创建 appwidgets - 服务中的 onConfigurationChanged 并不总是触发并且我找不到任何 Activity 级别调用(即 onUpdate,onReceive)。为了能够在方向更改时完全正确地重绘小部件,我只能使用一个 RemoteViews (updateAppWidget) 调用,因此此解决方案将不起作用。

有人知道如何解决这个问题吗?我想知道是否有可能实现我自己的 RemoteViews,该 RemoteViews 调用了一个无错误的 setImageURI 函数(在自定义 ImageView 类中),以便正确进行缩放。似乎很多工作只是更新一些小部件,我不确定 android 是否允许我以这种方式扩展 RemoteViews/ImageView。

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

很想听听任何其他建议或解决方法!谢谢。

最佳答案

我在开发集合的 AppWidget 时遇到了同样的问题。很多时候会发生以下情况:

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

..等等。我得出了与您相同的结论:android 使用它存储在某个 secret 位置的最后一次 RemoteViews 调用销毁并重新创建小部件 View 。在确认这一点之后,这是一个精确计时调用 AppWidgetManager.getInstance(context).updateAppWidget() 的问题,因为我想禁用 clickListeners (或 PendingIntents) 在告诉 ListView 刷新自身(这是调用 Web 服务和检索大量数据的网络操作)并希望在 ListView 完成加载后启用监听器同时维护 RemoteViews满载以处理旋转。

我差点放弃并使用它作为替代品..

Is there anyway to intercept android when the screen orientation changes and force it to redraw the whole widget?

.. 与 AppWidget 不同,确实拦截 Android 旋转更改的服务。如果您没有其他选择,我建议您尝试一下:

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

了解有关该服务的更多信息 here in StackOverflow .

关于android - 应用小部件更新问题 : Failed Binder Transaction, RemoteViews、setImageURI 和方向更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824393/

相关文章:

android - 如何为所有 Activity 设置固定方向

Flutter:如何防止设备方向变化和强制纵向?

ios - MPMoviePlayerController 方向错误在设备上但不在模拟器中

android - 如何向 Android 的 RecyclerView 添加一个简单的 8dp 页眉/页脚?

java - 安卓通过onclick获取url

android - AIDE "Unknown entity ' R'"Android Studio 应用程序项目出错

android - 我可以在没有任何传递的情况下在 2 个进程之间共享内存吗? (在安卓 NDK 中)

objective-c - 在分割 View 中调用关闭模态视图 Controller 会导致旋转到纵向模式

android - 方向改变时的 radio 组行为

javascript - JS 方向更改监听器不会在 iOS 上触发,但在 Android 上会触发