MacでAndroidウィジェットのTodoリストを作りたいけれど、環境構築やウィジェット特有の更新処理でつまずいていませんか。
この記事を最後まで読むと、Mac上での最短ルートでAndroidウィジェットを動かす手順が身につきます。環境セットアップから実機やエミュレータでの確認、Todoの保存やウィジェット更新のコツまで実体験ベースで丁寧に案内します。
| 項目 | 内容 |
|---|---|
| Mac向けの最短環境構築 | HomebrewやAndroidStudioの設定を含めて、時間を無駄にしない手順を紹介します。 |
| 実機で動くウィジェットの完成手順 | シンプルなUIとバックグラウンド更新を組み合わせて、実際に使えるTodoウィジェットを作ります。 |
| 実用的な更新と同期のコツ | ローカル保存とウィジェット更新の仕組みや、よくある落とし穴の回避方法を共有します。 |
難しく見える部分も一つずつ丁寧に進めれば大丈夫です。まずは手を動かして、楽しみながら動くものを作りましょう。
Android博士焦らず順序どおりに進めれば確実にウィジェットは動きます。詰まったときの具体的な解決策も丁寧に伝えるので安心してくださいね。
MacでAndroidウィジェットに表示するシンプルなTodoリストを作る手順


この章では、Mac上のAndroid StudioでシンプルなTodoウィジェットを作る流れをやさしく案内します。単純にホーム画面に一覧を表示して追加できるパターンと、ウィジェットごとに別々のリストを持たせるパターンの両方を扱います。実際のファイル配置やコードの置き場所まで触れるので迷わず進めます。
要点は、レイアウトXMLを res/layout に置くこと、AppWidgetProviderで RemoteViews を組み立てること、そしてデータは SharedPreferences かウィジェットIDをキーにした保存で分けることです。エミュレータでの追加確認や削除時の掃除もカバーします。
- 単一ウィジェットで一覧を表示して項目を追加する実装を行う手順。
- 複数ウィジェットで個別のリストを持たせる実装を行う手順。
- エミュレータや実機での配置と削除時のデータクリアの扱い方。
単一ウィジェットで一覧を表示して項目を追加するパターン


単一ウィジェットはシンプルさが魅力で、1つの SharedPreferences に配列やJSONでTodoを保持して RemoteViews に反映します。追加ボタンは PendingIntent を経由して Broadcast を受け取り、保存してからウィジェットを更新します。
レイアウトは高さを抑えた1列リストで十分です。RemoteViews はビューを個別に更新できるので、全体再描画より差分更新を意識するとユーザ体験がより滑らかになります。
AndroidStudioでウィジェット用のlayout XMLを作成する場所と名前
| 項目 | 内容 |
|---|---|
| ファイルの場所 | app/src/main/res/layout に配置します。 |
| 推奨ファイル名 | widget_todo.xml などウィジェット用途が分かる名前にします。 |
| 作り方のポイント | RemoteViewsに対応する簡素な構造にして、ボタンやListView用のIDを明確にします。 |
AppWidgetProviderを作ってonUpdateでRemoteViewsを設定する実装場所
package下に TodoWidgetProvider のようなクラスを作り、AppWidgetProviderを継承しておきます。
作成したクラスと AppWidgetProviderInfo XML をマニフェストに登録しておきます。
onUpdateでRemoteViewsを生成し、必要なセットと appWidgetManager.updateAppWidget を行います。
SharedPreferencesにTodoを保存してRemoteViewsに反映する具体的な流れ
新しいTodoはSharedPreferencesにJSON配列かカンマ区切りで保存し、キーは固定で扱います。
onUpdateやBroadcast受信時に読み込み、RemoteViewsのテキストやList部品に反映して更新します。
保存後はAppWidgetManagerを使って該当ウィジェットを更新し、ユーザに即時反映します。
PendingIntentで追加ボタンを受け取りBroadcastで処理する設定箇所
RemoteViews#setOnClickPendingIntentで追加ボタンにPendingIntentを紐付けます。
PendingIntentはBroadcast向けに作り、受け取りはAppWidgetProviderのonReceiveで行います。
onReceiveで保存処理を呼び、保存後にupdateAppWidgetで表示を更新します。
Macのエミュレータまたは実機でウィジェットをホーム画面に追加して確認するやり方
- MacのAndroid Studioでアプリをビルドしてエミュレータを起動します。実機を使う場合はUSBデバッグを有効にして接続します。
- ホーム画面を長押ししてウィジェット一覧を開き、作成したウィジェットを選んで配置します。
- ウィジェットの追加後に動作確認として追加ボタンを押し、SharedPreferencesに値が入っているか確認します。
複数ウィジェットで個別のリストを持たせるパターン


複数ウィジェットパターンは、ウィジェットごとに別のリストを持たせたいときに使います。appWidgetIdをキーにして保存先を分け、ConfigureActivityで初期設定を受け取ると柔軟に振る舞わせられます。
RemoteViewsFactoryを使うとウィジェットごとにList表示が可能です。データの掃除や競合を避けるために削除時のクリーン処理を忘れないようにしましょう。
appWidgetIdを使ってウィジェットごとの保存先を分ける方法と保存場所
| 項目 | 内容 |
|---|---|
| キーの例 | todo_〈appWidgetId〉 のように appWidgetId を付けて個別キーにします。 |
| 保存場所 | SharedPreferences かファイルストレージを使い、キーで識別します。 |
| 注意点 | キーの命名衝突を避け、ウィジェット削除時に該当キーを消すことを忘れないでください。 |
RemoteViewsFactoryでウィジェット別にList表示するファイルと登録箇所
RemoteViewsServiceを実装し、Factoryでリストアイテムを返す処理を実装します。
作成したServiceをマニフェストに登録しておきます。
onUpdateでRemoteAdapterをウィジェットのListViewに設定してウィジェット別の表示にします。
Configure Activityでウィジェット初期設定を受け取り保存する実装場所
ウィジェット初期化UIを持つActivityを用意し、ユーザ設定を受け取れるようにします。
xmlのconfigure属性に作成したActivityを指定し、ウィジェット追加時に表示されるようにします。
設定を保存したら setResult(RESULT_OK, intent) で appWidgetId を返し、ウィジェット更新を行います。
ウィジェット削除時にデータをクリーンアップするBroadcast受信の処理場所
AppWidgetProvider の onDeleted をオーバーライドして削除された appWidgetId を受け取ります。
受け取った appWidgetId に紐づくSharedPreferencesやファイルを削除してクリーンにします。
必要なら onReceive で ACTION_APPWIDGET_DELETED を捕まえて追加の後始末処理を行います。
Macでウィジェット内の編集操作とアプリ同期を実装する方法


ウィジェット内でタスクを編集したり完了にしたときに、アプリ本体のデータとズレが出ないようにするのは大事です。ここではどこでIntentやブロードキャストを作るか、どのタイミングでDBを書き換えてウィジェットを更新するかをわかりやすくまとめます。初めて触る人でも迷わないように、実際によく使うパターンだけに絞って説明します。
大まかな流れは三つです。ウィジェット側で操作を送るためのIntentを用意すること、受け取った側で安全にDBを書き換えること、DBの変化を検知してAppWidgetManager経由でウィジェットを更新することです。それぞれの役割を分けるとバグが減ります。
実運用では短時間の更新はCoroutineで処理し、確実に反映させたい処理はWorkManagerを使うと安心です。RemoteViewsの制約を意識しつつ、DBを単一の情報源にする設計を心がけると同期がスムーズになります。
ウィジェットからタスクを編集や完了にする操作の実装パターン


ウィジェットからの操作は大きく分けて二つのパターンがあります。一つはタップして編集画面を開くパターンで、もう一つはチェックボックスやボタンで直接アクションを送るパターンです。どちらもRemoteViews経由でPendingIntentを使う点は共通しています。
実運用では編集はActivityで完了させてDBを書き換え、完了通知を送ってウィジェットを更新する流れが安定します。一方でチェック操作のような軽い更新は、その場でBroadcastを飛ばして受け取った側でDB更新と部分的なRemoteViews更新を行うのが速くて扱いやすいです。
タップで編集Activityを開くIntentの作成場所と結果受け取りの実装
AppWidgetProviderのupdateAppWidgetやonUpdate内でPendingIntentTemplateを生成してRemoteViewsにセットします。これで各リストアイテムが共通の起点を持てます。
RemoteViewsFactoryや更新処理の中で各アイテムにIDや状態を入れたfillInIntentをセットします。これでどのタスクを編集するかがActivityに渡ります。
編集ActivityはDBを書き換えたあとにローカルブロードキャストや直接AppWidgetManagerを呼んでウィジェットを更新します。startActivityForResultはウィジェット側で使えない点に注意してください。
チェック操作をBroadcastで受けてRemoteViewsを更新する処理箇所
RemoteViewsのボタンに対してPendingIntent.getBroadcastを使い、タスクIDとアクションをextrasに詰めてセットします。これをupdateAppWidget内で行います。
AppWidgetProviderのonReceiveで該当アクションを受け取り、まずはDB更新のトリガーを呼びます。UIのDirect操作はRemoteViews経由で行います。
DBを更新したあとにAppWidgetManager.notifyAppWidgetViewDataChangedやupdateAppWidgetを呼んで表示を更新します。これでチェック状態がウィジェットに反映されます。
アプリ本体と共有するRoomデータベースで同期するパターン


アプリ本体と同じRoomデータベースを使えば、ウィジェットとアプリでデータの食い違いを減らせます。ウィジェット側からは直接DAOを呼べますが、UIスレッドでの処理は避ける必要があります。単一のデータが真実の源になるように設計するとバグが少なくなります。
変更の検知にはRoomのFlowやLiveDataが便利です。アプリ側で観察して変化があればAppWidgetManagerへ通知するか、DB更新側が直接ウィジェット更新を呼ぶという役割分担が実用的です。
CoroutineやWorkManagerでDAOを呼び出してDBを書き換える実行場所とタイミング
AppWidgetProviderのonReceiveで軽い更新ならCoroutineScope(Dispatchers.IO)を使ってDAOを呼びます。処理が短ければそのままDBを書き換えて問題ありません。
確実に実行したい更新やリトライが必要な処理はWorkManagerに仕事を渡します。doWork内でDAOを呼んでDBを操作すると安全です。
ウィジェットはライフサイクルを持たないため、長時間のCoroutineはWorkManagerに任せるのが堅実です。短期のIO操作はCoroutineでさくっと処理します。
DB更新を検知してAppWidgetManagerにウィジェット更新を通知する呼び出し箇所
アプリ内でFlowやLiveDataを監視し、変化を検知したらAppWidgetManagerへ更新命令を送ります。監視はアプリ側で行うと安定します。
DB更新の直後にAppWidgetManager.notifyAppWidgetViewDataChangedを呼んでリストビューを再読み込みさせ、必要ならupdateAppWidgetで個別ビューを更新します。
WorkManagerやDB更新処理の最後で明示的にACTION_APPWIDGET_UPDATEのブロードキャストを送ると、ウィジェットが確実に変化を受け取れます。
よくある質問


- Macで作ったTodoをAndroidウィジェットに表示できますか。
できます。Mac上で管理したTodoはFirebaseや自分で用意したAPIで同期しAndroidウィジェットに表示できます。実用的にはFirestoreやRESTAPIを使うと同期と読み書きが楽になります。
- M1やM2のMacでも手順は同じですか。
ほぼ同じです。AndroidStudioやSDKのインストールと設定の流れは同じなのでそのまま進めて問題ありません。エミュレータが重いと感じたら実機での動作確認を優先すると効率良く進められます。
- リアルタイム同期は難しいですか。
FirebaseRealtimeDatabaseやFirestoreを使えば近いリアルタイム同期が簡単に実現できます。ローカルだけに限定する場合はWebSocketやプッシュ通知で更新を伝える方法を検討してください。
- ウィジェットの見た目や複数端末対応はどうするか。
小中大のウィジェットレイアウトを用意して画面サイズに応じて切り替えるのが基本です。レイアウトを分けると複数端末での見栄えが安定しますしフォントや余白を調整するとさらに良くなります。
まとめ


MacのAndroid Studioでウィジェットに表示するシンプルなTodoリストを作る流れをやさしくまとめました。プロジェクト準備からレイアウト作成、AppWidgetの更新処理、SharedPreferencesでの保存まで、実際に動くところまで丁寧に説明しています。
動作確認はエミュレーターだけでなく実機でも行ってください。実機ではウィジェットのリサイズやホームランチャーごとの見え方、バッテリー制約で挙動が変わることがあるので、最終チェックは実機で行うと安心です。



焦らず一歩ずつ進めてください。小さな機能を作っては動かし、ログを見て直していくと着実に完成に近づきます。
