AppWidgets の更新に問題があり、Android の制限/バグの合流により、回避策を見つけることができません。
私のアプリ ウィジェットはテーマに対応しているため、実行時にイメージビューを更新できる必要があります (テキストビューとインテントも同様です)。更新中のイメージビューは最大 9 つですが、使用しているグラフィックのサイズはかなり控えめです (最大 11kb の png)。RemoteViews オブジェクトを介してプッシュするデータの合計サイズは、1 MB の制限内で 100 KB 未満にする必要があります。画面上の実際のドローアブル リソースは元の png よりもサイズが大きくなると思いますが、それを説明するには制限の 10% が妥当なようです。ただし、特定の電話とランチャーでは、「FAILED BINDER TRANSACTION」エラーが発生します。
これに対して私が見つけた2つの解決策があります:
1) RemoteViews オブジェクトで setImageViewResource の代わりに setImageViewUri (setImageURI を呼び出す) を使用します。これにより、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 ) 。
2 番目のアプローチの問題は、画面の向きが変わると、Android が秘密の場所に保存した最後の RemoteViews 呼び出しを使用してウィジェット ビューを破棄して再作成することです。これは、RemoteView 呼び出しを分割してウィジェットが使用できなくなるため、appwidget が完全に再描画されないことを意味します。Android がいつ appwidgets を破棄して再作成するかを把握する信頼できる方法はないようです。サービスの onConfigurationChanged が常に起動するとは限らず、アクティビティ レベルの呼び出し (つまり、onUpdate、onReceive) が行われることはありません。方向の変更時にウィジェットを完全かつ正確に再描画できるようにするために、RemoteViews (updateAppWidget) 呼び出しを 1 つしか使用できないため、このソリューションは機能しません。
これを回避する方法を知っている人はいますか? スケーリングが正しく行われるように、(カスタム ImageView クラスで) バグのない setImageURI 関数を呼び出す独自の RemoteViews を実装できるかどうか疑問に思っています。いくつかのウィジェットを更新するだけで多くの作業が必要なようですが、Android で RemoteViews/ImageView をそのように拡張できるかどうかはわかりません。
画面の向きが変わったときにアンドロイドを傍受し、ウィジェット全体を強制的に再描画する方法はありますか?
他の提案や回避策のアイデアを聞きたいです! ありがとう。