ホーム画面にバッテリー残量ウィジェットを置きたいが、どこから手をつければよいか迷っている方は多いです。
この記事を読むと、初心者でも確実に動くウィジェットを作れる手順と、実機での動作確認やトラブル対応のコツが身につきます。
| 項目 | 内容 |
|---|---|
| 独自コンテンツ1 | 動くAppWidgetのサンプルコードと導入手順を丁寧に示している点。 |
| 独自コンテンツ2 | 実機でよく出る問題と、その場で使える具体的な解決策を紹介している点。 |
| 独自コンテンツ3 | バッテリー消費を抑える更新戦略や見た目を良くするデザイン案を実用的に解説している点。 |
手順通りに作れば短時間で結果が出ますので、ワクワクしながら一つずつ動かしていきましょう。
Android博士最初は戸惑っても大丈夫です。ゆっくり試しながら進めれば確実に形になりますから、気楽に取り組んでみてくださいね。
Androidでバッテリー残量ウィジェットを作る基本手順


Androidでバッテリー残量ウィジェットを作るときは、まず目的をはっきりさせると迷わず進めます。表示だけで良いのか、充電状態やアイコンも見せたいのかで作り方が変わります。
基本の流れはシンプルです。レイアウトを用意してTextViewやImageViewを配置し、AppWidgetProviderでRemoteViewsを更新して、必要ならWorkManagerやAlarmManagerで定期更新を仕込みます。



まずは小さく始めましょう。最初はテキスト表示だけ作ってから、慣れてきたらアイコンや定期更新を追加すると失敗が少ないですよ。
最もシンプルに残量をテキスト表示する方法(AppWidgetProviderを使う)


AppWidgetProviderを使った最もシンプルな方法は、レイアウトにTextViewを置いてonUpdateで残量を取得して反映するだけです。BroadcastReceiverを別に用意せずにAppWidgetProviderのonUpdateで更新処理を書くと手早く動きます。
残量の取得はBatteryManagerやACTION_BATTERY_CHANGEDインテントを使います。RemoteViewsのsetTextViewTextでTextViewの中身を更新し、AppWidgetManager.updateAppWidgetでウィジェットを反映させます。
app/src/main/res/layout/widget_battery.xmlでTextViewを作る
app/src/main/res/layout/widget_battery.xmlを作成してルートに適切なサイズのViewGroupを置きます。
TextViewにandroid:id=”@+id/battery_text”を付けてフォントサイズやパディングを指定します。
ウィジェットは複数サイズに対応するためwrap_contentやminWidthを考えてレイアウトを調整します。
app/src/main/java/(自分のパッケージ)/BatteryWidgetProvider.javaでAppWidgetProviderを実装する
app/src/main/java/パッケージ/BatteryWidgetProvider.javaでAppWidgetProviderを継承したクラスを作ります。
onUpdate内でBatteryManagerやACTION_BATTERY_CHANGEDから残量を取得してRemoteViewsに反映します。
必要ならPendingIntentでウィジェットのタップ時の動作を設定しておきます。
res/xml/widget_info.xmlとAndroidManifest.xmlにウィジェットの登録を追加する
| 項目 | 内容 |
|---|---|
| res/xml/widget_info.xml | ウィジェットのサイズや初期更新間隔、preview用のレイアウトを定義します。 |
| AndroidManifest.xml | AppWidgetProviderクラスをreceiverとして登録しmeta-dataでwidget_info.xmlを参照します。 |
| 注意点 | minWidthやminHeightはdpで正しく設定して、複数のホーム画面サイズに対応させます。 |
充電状態とアイコンを合わせて表示する方法(ImageViewを更新する)


充電状態をアイコンで見せると視認性が上がります。ImageViewをレイアウトに追加して、充電中や満充電などの状態に応じてdrawableを切り替えると分かりやすくなります。
充電状態はACTION_BATTERY_CHANGEDインテントのpluggedフィールドやBatteryManagerの状態で判定します。RemoteViewsのsetImageViewResourceでアイコンを更新するのが手軽です。
res/drawableに充電状態用のアイコンを置きlayoutにImageViewを追加して更新処理を書く
- 充電状態ごとのアイコンをres/drawableに配置してファイル名を規則的に揃えます。
- layoutにImageViewを追加してidを付けておきます。
- AppWidgetProviderの更新処理で状態に応じてsetImageViewResourceを呼んでアイコンを差し替えます。
ウィジェットの残量表示を正確に保つための定期更新方法


ウィジェットはホーム画面の表示に依存するため、常に正しい残量を見せたい場合は定期更新が必要です。WorkManagerやAlarmManagerで定期的に更新処理を起動してAppWidgetManager経由でRemoteViewsを更新すると安定します。
WorkManagerはDozeモードやバッテリー最適化に強く、短い周期で確実に動かしたいときに便利です。一方で頻繁な更新はバッテリーを消費するので更新間隔は慎重に決めてください。
WorkManagerまたはAlarmManagerで定期的に更新処理を起動してAppWidgetManagerでRemoteViewsを更新する
WorkManagerでPeriodicWorkRequestを作るかAlarmManagerでPendingIntentを登録して定期的に更新処理を起動します。
起動されたWorkerやBroadcastReceiver内でAppWidgetManager.getInstanceとupdateAppWidgetを呼んでRemoteViewsを反映します。
更新間隔はユーザーの負荷とトレードオフなので短すぎない値にし、画面オフ時の更新は控えめにします。
Androidで実体験に基づく応用テクニック


バッテリーウィジェットをもう少し便利にする実践的な工夫をまとめました。ここでは実際に動かして役立ったテクニックをやさしく紹介します。
扱うのは主に3つの応用です。ウィジェットをタップしてバッテリー設定を開く方法、残量が低いときに色や文字サイズで目立たせる方法、バーや小さなグラフで残量を見せる方法です。
- タップで設定画面を開く。ユーザーがすぐ設定にたどり着けると便利です。
- 閾値で色や文字サイズを切り替える。視認性を上げて気づきを促します。
- バーや小さなグラフで直感的に残量を見せる。数字だけより分かりやすくなります。



小さく作って何度も動かしてみると理解が早くなります。焦らず一つずつ試して、動いたときの嬉しさを楽しんでください。
ウィジェットをタップしてバッテリー設定を開くようにする方法


ウィジェットをタップしてバッテリー設定を開くには、RemoteViewsのsetOnClickPendingIntentを使います。IntentにSettings.ACTION_BATTERY_SAVER_SETTINGSやACTION_POWER_USAGE_SUMMARYを入れてPendingIntentを作り、ウィジェットにセットします。
注意点はPendingIntentのフラグです。最新のAndroidではFLAG_IMMUTABLEやFLAG_UPDATE_CURRENTを指定して安全に動かすと安定します。
RemoteViewsにPendingIntentをセットしてSettings.ACTION_BATTERY_SAVER_SETTINGSや電池使用量画面を開く
Settings.ACTION_BATTERY_SAVER_SETTINGSやACTION_POWER_USAGE_SUMMARYなど開きたい設定画面のIntentを作成します。
PendingIntent.getActivityでPendingIntentを作成します。FLAG_UPDATE_CURRENTとFLAG_IMMUTABLEを指定すると安全に動きます。
RemoteViews.setOnClickPendingIntentでビューにPendingIntentを紐付け、一度AppWidgetManager.updateAppWidgetで反映します。
残量が低いときに色やサイズで視認性を上げる方法


残量が低いときに色や文字サイズで目立たせると、ユーザーの気づきが早くなります。RemoteViews.setTextColorやsetTextViewTextSizeで表示を切り替えれば手軽に実装できます。
更新のタイミングはBatteryの変化を受け取るか定期的な更新で行います。コントラストの高い色を選び、テーマやダークモードで読みにくくならないよう確認してください。
RemoteViews.setTextColorやsetTextViewTextSizeで閾値以下のときに色と文字サイズを切り替える
- 閾値を決める。たとえば20や15などユーザーが気づきやすい数値を選びます。
- 残量を取得して閾値と比較する。BatteryManagerやACTION_BATTERY_CHANGEDを利用します。
- 該当する色と文字サイズを決める。視認性優先でコントラストを確保します。
- RemoteViews.setTextColorとsetTextViewTextSizeを呼んでupdateAppWidgetで反映します。
残量をバーや小さなグラフで見せる方法


残量をバーや小さなグラフで見せると直感的に理解できます。標準のProgressBarをレイアウトに置いてRemoteViews.setProgressBarで値を更新するのが手軽で互換性も高いです。
よりリッチなグラフはカスタムビューをBitmapに描画してRemoteViews.setImageViewBitmapで差し替える方法が有効です。描画はバックグラウンドで行い負荷を避けることが大切です。
layoutにProgressBarやカスタムビューを追加してRemoteViews.setProgressBarで値を更新する
layoutにProgressBarを置くか、カスタムグラフ用にImageViewを用意します。見た目は小さくても分かりやすく作ります。
RemoteViews.setProgressBarでmaxを100にして現在値を設定します。AppWidgetManager.updateAppWidgetで反映します。
グラフをBitmapに描画してRemoteViews.setImageViewBitmapでImageViewを更新します。描画はワーカースレッドで行いUIスレッドの負荷を避けます。
よくある質問


- ウィジェットが更新されない原因は何ですか。
省電力やDozeで定期更新が止まることが多いですので、onUpdateでRemoteViewsを更新しAlarmManagerやWorkManagerで定期処理を登録してください。ACTION_BATTERY_CHANGEDはマニフェストで常時受け取れないので、動的に受信するか起動時に現在値を取得してください。
- 表示されるバッテリー残量がずれて見えるのはなぜですか。
システムはレベルとスケールから整数で返すため丸めの差が出ることがあります。registerReceiver(null,new IntentFilter(Intent.ACTION_BATTERY_CHANGED))で最新値を取得し、必要なら移動平均で揺れを抑えると見た目が安定します。
- 端末を再起動するとウィジェットの更新が止まりますか。
再起動でアラームやジョブが消えるためBOOT_COMPLETEDを受けて再登録するかWorkManagerで永続化する方法が安全です。端末の省電力設定で再登録がブロックされることがあるので、ユーザーに除外を案内すると信頼性が上がります。
- バッテリー情報取得に特別な権限は必要ですか。
バッテリー残量を取得するための危険な権限は不要です。だがメーカーの最適化やバックグラウンド制限で動作に差が出ることがあるので、複数端末で短い動作確認をして問題ある機種には簡潔な説明を出すと親切です。
まとめ


バッテリー残量ウィジェットの作り方を手順に沿ってまとめました。基本はAppWidgetでレイアウトを用意し、RemoteViewsで表示を更新し、バッテリー情報を取得して反映することです。
バッテリー情報はACTION_BATTERY_CHANGEDをContext.registerReceiverで取得するのが手軽です。更新は頻繁に行うと消費が増えるので、レベル変化や充電状態の変化をきっかけに更新するのがおすすめです。
定期更新はWorkManagerなどで安全に行い、省電力モードや複数のAndroidバージョンで実機テストしてください。まずは最小構成で動くものを作り、そのあとで見た目や通知連携を追加すると安心です。



最初はとにかくシンプルに動くものを作ってください。動かした経験が次の改善のヒントになり、少しずつ自分好みに育てられますよ。
注意点として更新間隔を短くしすぎると端末の電池消耗が増えたり、最新のバックグラウンド制限で期待どおり動かなくなることがあります。
