3

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 をそのように拡張できるかどうかはわかりません。

画面の向きが変わったときにアンドロイドを傍受し、ウィジェット全体を強制的に再描画する方法はありますか?

他の提案や回避策のアイデアを聞きたいです! ありがとう。

4

1 に答える 1

0

コレクションの AppWidget を開発するときに同じ問題に遭遇しました。何度も次のことが起こりました。

  • 回転すると、ListView は完全に消えました。
  • ボタン リスナー (実際には と呼ばれるPendingIntents) が応答を停止しました。
  • 経由での画像の変更はsetImageViewResource更新されませんでした。

.. 等々。私はあなたと同じ結論に達しました.Androidは、秘密の場所に保存されている最後のRemoteViews呼び出しを使用して、ウィジェットビューを破棄および再作成します。それを認めた後、ListViewにそれ自体を更新するように指示した後、 clickListeners(またはPendingIntents)を無効にしたかったので、呼び出しのタイミングを調整する問題でした(これはWebサービスを呼び出して重要なものを取得するネットワーク操作でした)ローテーションを処理するために完全にロードされた RemoteViews を維持しながら、ListView のロードが完了した後にリスナーを有効にしたいと考えていました。AppWidgetManager.getInstance(context).updateAppWidget()

私はあきらめて代わりに使用するところだった..

画面の向きが変わったときにアンドロイドを傍受し、ウィジェット全体を強制的に再描画する方法はありますか?

.. AppWidget とは異なり、Android のローテーションの変更をインターセプトするサービス。オプションが不足している場合は、試してみることをお勧めします。

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

このサービスの詳細については、こちらの StackOverflowをご覧ください。

于 2013-04-26T13:35:01.990 に答える