Android AppWidget - 開発Tips

こんにちは。

Android AppWidgetを開発していろいろTipsがあったので、備忘録を兼ねてブログを書きます。

参考にしたのは、こちらです。
http://d.hatena.ne.jp/moto_maka/20110121/1295550864
http://y-anz-m.blogspot.com/2011/06/androidappwidget.html

それでは、早速書いてみます。

  • AlermManagerは利用しませんでした。

AlermManagerを利用するとクラスのインスタンス管理が手間なのでやめました。
1時間に1度、動作してほしかったので、そのままandroid:updatePeriodMillisを利用しました。
※仕様的にAlermManagerでServiceを使う必要があり、onEnabledとonDisabledがあってもService停止されたら制御に困るので。

  • HandlerでANR対策を実施しました。

表示するテキストのリスト情報取得は外部通信が必要だったので、onUpdateからHandlerを使いANR対策をしました。
また、処理に時間がかかるとユーザ体感が良くないので、処理をわけてHandlerを使いました。

  • onReceiveで全イベントを処理しました。

アプリを起動したりする場合も、あえて、onReceiveでイベントを受け取り、IntentでContext#startActivityを実施しました。
※PendingIntent#getBroadcastに忘れずにappWidgetIdは指定してPendingIntentを取得します。

なお、この場合は、Intent#setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)が必要でした。
また、Intentの識別にIntent#setActionやIntent#setDataを利用して、ハンドリングしました。
※AndroidManifest.xmlのreceiverのintent-filterにactionを登録するのも忘れずに。

  • appWidgetIdは自前で生成しました。

onUpdateのときしか引数でもらえないので、自前で、作成しています。
それと、同じPendingIntentでも違うIntentとして処理してほしかったからです。

  • 画像取得方法は、AsyncTaskを使わず直列にしました。

理由は、ViewFlipperのautoStartを実施すると、設定された値がすぐに表示されます。
そのとき、画像が表示されないでテキストだけ表示されて、次の表示タイミングで画像とテキストが表示されるとユーザに違和感を与えるのではと思いました。
なので、表示されるタイミングでは、画像とテキストが同時に表示されるのが望ましいと思い、直列で取得する方式にしました。

  • AppWidgetManager#updateAppWidgetは必要に応じて呼びだしました。

これは、単純に呼んだ数だけ、再描画されるので、AppWidgetが配置されるまでの間に、おかしな描画がされてしまいます。。。
不必要に呼び出すのはやめましょう。。。

  • ViewFlipperのsetAutoStartとsetFlipIntervalは呼び出せませんでした。

これは原因がいまだ分からず、layout.xmlandroid:autoStartとandroid:flipIntervalを指定することにしました。

ここにたどり着くのがやっと。
http://stackoverflow.com/questions/7117463/how-to-change-androidautostart-attribute-of-viewflipper-in-remoteviews-program

  • 最後に。

TODOは近いうちにチャレンジする機会があればやりたいですね。

  1. AppWidgetのConfigureActivityを作りたかった。
  2. 画像キャッシュは自作でなく、com.google.common.collect.MapMakerを使いたかった。