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.xmlでandroid:autoStartとandroid:flipIntervalを指定することにしました。
ここにたどり着くのがやっと。
http://stackoverflow.com/questions/7117463/how-to-change-androidautostart-attribute-of-viewflipper-in-remoteviews-program
- 最後に。
TODOは近いうちにチャレンジする機会があればやりたいですね。
- AppWidgetのConfigureActivityを作りたかった。
- 画像キャッシュは自作でなく、com.google.common.collect.MapMakerを使いたかった。