「[Android] RemoteViews が倒せない App Widgets の限界に挑戦(前編) - adakoda」の続編。
App Widgets として動作するコンパスアプリの話の続き。
このコンパスアプリは、App Widgets として実装しているため、
アプリを明示的に起動しなくても、ホームスクリーン上で、リアルタイムにコンパスの針がグリグリ動きます。
※App Widgets の更新間隔は1 秒間に設定
では、どうやって、App Widgets でイメージを更新しているかというと、エントリタイトルのとおり、RemoteViews クラスを使用しています。
具体的なソースコードは、以下のとおり。
@Override
public void onUpdate(
Context context,
AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
... 省略 ...
RemoteViews remoteViews = new RemoteViews(
context.getPackageName(),
R.layout.appwidget);
remoteViews.setImageViewBitmap(id.compass, bitmap);
for (int i = 0; i < appWidgetIds.length; i++) {
appWidgetManager.updateAppWidget(appWidgetIds[i], remoteViews);
}
... 省略 ...
}
簡単に解説しておくと、App Widgets のリソースにアクセスするには、RemoteViews インスタンスを作成する必要があります。
ここでは、App Widgets 内のリソースに、compass という名前の ImageView を配置しており、
同ビットマップを更新するために、setImageViewBitmap() を呼び出しています。
ポイントは、AppWidgetProvider.onUpdate() で渡された AppWidgetManager を使用し、updateAppWidget() 呼び出している箇所で、
これを実行しないと、いくら RemoteViews インスタンスを操作しても、更新されない点です。
また、ここで渡している Bitmap は、コンパスの針のイメージを 360枚用意しているかというと、そうではなくて、
実行時にソースコードベースで、動的に Bitmap を作成してしています。
※このあたりも長くなってしまうので、別のエントリで紹介する予定です
# 余談ですが、このコンパスアプリをホームスクリーンに16個登録して放置しておいたら、15時間ほどで電池が切れました
# HT-03Aの電池の充電は、PCからUSB経由で充電して、1時間に18%回復(約5時間ちょいで100%)という感じでした