mcpField
A
android-jetpack

android-jetpack

github.com/alphaonedev開発45 回インストール
リポジトリ

android-jetpack について

android-jetpackは、Jetpackコンポーネントを使ったAndroidアプリ開発向けのスキルです。ストレージ、ナビゲーション、バックグラウンド処理、カメラ、依存性注入、ページングを実装する開発者を対象とします。

主な機能

  1. 01RoomとDataStoreによるデータ永続化
  2. 02ナビゲーションとディープリンクの管理
  3. 03WorkManagerによるバックグラウンド処理
  4. 04CameraXによるカメラ機能の追加
  5. 05Hiltによる依存性注入
  6. 06Paging 3によるリスト読み込み

活用シーン

  1. 01Roomを使ったユーザーデータベースアプリの構築
  2. 02バックグラウンド同期と状態の保存
  3. 03アプリへのページングリストの追加
  4. 04カメラ撮影フローの実装

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/alphaonedev/openclaw-graph --skill android-jetpack

インストール後、Claude Code で/android-jetpackを入力して読み込まれたか確認します。

詳細

android-jetpack

目的

このスキルは、効率的で保守しやすい Android アプリを構築するために、Android Jetpack コンポーネントを統合するツールを提供します。データベース向けの Room、UI フロー向けの Navigation、バックグラウンドタスク向けの WorkManager、設定向けの DataStore、カメラ操作向けの CameraX、依存性注入向けの Hilt、データ読み込み向けの Paging 3 に重点を置いています。

使用するタイミング

永続ストレージ(例:SQLite 用の Room)、画面間のナビゲーション(例:Navigation Component)、スケジュールされたタスク(例:WorkManager)、安全な設定保存(例:DataStore)、カメラ機能(例:CameraX)、モジュール化された依存性注入(例:Hilt)、効率的なページネーション(例:Paging 3)が必要な Android アプリを構築する際に、このスキルを使用してください。複雑なデータフロー、バックグラウンド処理、またはハードウェアとの連携があるアプリに適用してください。

主な機能

  • Room:SQLite データベース向けの ORM で、エンティティ、DAO、マイグレーションをサポートします。
  • Navigation:NavController を介して、フラグメントトランザクションとディープリンクを管理します。
  • WorkManager:ネットワーク接続状況などの制約を指定して、延期可能なタスクをスケジュールします。
  • DataStore:型付きストレージにプロトコルバッファを使用し、SharedPreferences を置き換えます。
  • CameraX:プレビュー、撮影、分析のためにカメラハードウェアを抽象化します。
  • Hilt:Android 固有のアノテーションを使用して、依存性注入のための Dagger を簡素化します。
  • Paging 3:データをページ単位で読み込み、LiveData または Flow と連携します。

使用パターン

Room を使用するには、build.gradle に依存関係を追加します:implementation 'androidx.room:room-runtime:2.5.0'。エンティティを定義します:@Entity class User(val id: Int, val name: String)。DAO を作成します:interface UserDao { @Query("SELECT * FROM user") fun getAll(): List<User> }。データベースをセットアップします:Room.databaseBuilder(context, AppDatabase::class.java, "database-name").build()。

Navigation を使用するには、build.gradle に追加します:implementation 'androidx.navigation:navigation-fragment-ktx:2.5.0'。XML で Nav Graph を作成します:<navigation xmlns:android="http://schemas.android.com/apk/res/android" ...> <fragment android:id="@+id/mainFragment" ...> <action android:id="@+id/action_to_detail" app:destination="@id/detailFragment" /> </fragment> </navigation>。コード内でナビゲートします:findNavController().navigate(R.id.action_to_detail)。

Hilt を統合するには、次を追加します:implementation 'com.google.dagger:hilt-android:2.44'。アプリケーションにアノテーションを付けます:@HiltAndroidApp class MyApp : Application()。依存関係を注入します:@AndroidEntryPoint class MainActivity : AppCompatActivity() { @Inject lateinit var viewModel: MyViewModel }。

WorkManager では、タスクをキューに追加します:WorkManager.getInstance(context).enqueue(OneTimeWorkRequestBuilder<MyWorker>().build())。ワーカーを定義します:class MyWorker(context: Context, params: WorkerParameters) : Worker(context, params) { override fun doWork(): Result { // Perform task return Result.success() } }。

設定には DataStore を使用します:implementation 'androidx.datastore:datastore-preferences:1.0.0' を追加します。アクセスします:val dataStore = applicationContext.dataStore。読み込み/書き込みを行います:dataStore.edit { settings -> settings[STRING_KEY] = "value" }。

CameraX では、カメラをバインドします:ProcessCameraProvider.getInstance(context).use { provider -> val camera = provider.bindToLifecycle(this, cameraSelector, preview) }。プレビューを設定します:val preview = Preview.Builder().build().also { it.setSurfaceProvider(viewFinder.surfaceProvider) }。

Paging 3 では、PagingSource を作成します:class UserPagingSource : PagingSource<Int, User>() { override suspend fun load(params: LoadParams<Int>): LoadResult<Int, User> { // Fetch data return LoadResult.Page(data, prevKey, nextKey) } }。ViewModel で使用します:val pager = Pager(config) { UserPagingSource() }.flow。

一般的なコマンド/API

  • Room CLI:Room の統合を確認するには、./gradlew dependencies を使用します。マイグレーションでは、ADB 経由でデータベースのクエリを実行します:adb shell sqlite3 /data/data/your.package/databases/yourdb "PRAGMA user_version;"。
  • Navigation API:画面遷移には NavController.navigate(actionId) を呼び出します。Nav Graph ではディープリンクを使用します:<deepLink app:uri="yourapp://details/{id}" />。
  • WorkManager API:制約を指定してエンキューします:OneTimeWorkRequestBuilder<MyWorker>().setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()).build()。ステータスを確認します:WorkManager.getInstance().getWorkInfosForUniqueWork("workName").observe(...)。
  • DataStore API:設定を読み取ります:dataStore.data.map { preferences -> preferences[STRING_KEY] }。フローを処理します:collect { value -> /* process */ } を使用します。
  • CameraX API:画像をキャプチャします:imageCapture.takePicture(outputFileOptions, executor, object : ImageCapture.OnImageSavedCallback { override fun onImageSaved(output: ImageCapture.OutputFileResults) { // Handle saved file } })。
  • Hilt API:./gradlew hiltGenerateSources でコードを生成します。モジュールをインジェクトします:@Module @InstallIn(SingletonComponent::class) class AppModule { @Provides fun provideService(): Service = Service() }。
  • Paging 3 API:RemoteMediator と組み合わせて、ネットワークと DB を連携させます:Pager( config = PagingConfig(pageSize = 20), remoteMediator = UserRemoteMediator(), pagingSourceFactory = { UserPagingSource() } )。

統合に関する注意事項

データベースにアノテーションを付けて、Room と Hilt を統合します:@Database(entities = [User::class], version = 1) @HiltDatabase abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao }。WorkManager と Navigation では、フラグメント内でワークのステータスを監視します:WorkManager.getInstance().getWorkInfoByIdLiveData(workId).observe(viewLifecycleOwner) { info -> if (info.state == WorkInfo.State.SUCCEEDED) navigateToResult() }。DataStore を Paging とともに使用するには、ページネーションキーを DataStore に保存し、フロー経由で取得します。CameraX では、権限を確認します:ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED で確認してください。API キーが必要な場合(例:WorkManager で使用する外部サービス用)は、build.gradle または strings.xml で $GOOGLE_API_KEY のような環境変数を使用します。Paging と Room を組み合わせるには、PagingSource のデータソースとして Room を使用します。

エラー処理

Room では、SQLite の例外を捕捉します:try { dao.insert(user) } catch (e: SQLiteConstraintException) { Log.e("RoomError", e.message ?: "Constraint violation") }。Navigation のエラーを処理するには、NavController.addOnDestinationChangedListener を使用して、無効なアクションを捕捉します。WorkManager では、doWork 内で Result.retry() を確認します:if (error) return Result.retry()。DataStore のエラーに対処するには、読み取り処理を try-catch で囲み、IOException を捕捉します。CameraX では、CameraX.bindToLifecycle の失敗を処理します:try { provider.unbindAll() } catch (e: IllegalStateException) { Log.e("CameraError", "Binding failed") }。Hilt のインジェクションエラーを解決するには、@Inject アノテーションを確認し、./gradlew clean を実行します。Paging 3 では、LoadState のエラーを捕捉します:pager.loadStateFlow.collect { state -> if (state.refresh is LoadState.Error) Log.e("PagingError", state.refresh.error.message ?: "Load failed") }。

具体的な使用例

  1. 例:Room と Hilt を使用するユーザーアプリ:ViewModel で Room DAO をインジェクトします:@HiltViewModel class UserViewModel @Inject constructor(private val userDao: UserDao) : ViewModel() { fun getUsers() = userDao.getAll() }。Activity では、Hilt を使ってインジェクトし、表示します:viewModel.getUsers().observe(this) { users -> adapter.submitList(users) }。
  2. 例:WorkManager と DataStore を使用したバックグラウンド同期:データを取得して DataStore に保存するワーカーをエンキューします:WorkManager.enqueue(OneTimeWorkRequestBuilder<SyncWorker>().build())。ワーカー内では、dataStore.edit { it[LAST_SYNC_KEY] = System.currentTimeMillis() } を実行します。その後、UI で DataStore から読み取り、最終同期時刻を確認します。

グラフの関連性

  • Room が依存するもの:Android core(SQLite 用)と Hilt(依存性注入用)。
  • Navigation が連携するもの:WorkManager(非同期ナビゲーション用)と Paging 3(リストナビゲーション用)。
  • WorkManager が関連するもの:DataStore(結果の保存用)と CameraX(バックグラウンド処理用)。
  • DataStore が接続するもの:Room(代替ストレージとして)と Hilt(注入されたアクセス用)。
  • CameraX が連携するもの:Navigation(カメラ UI フロー用)。
  • Hilt が依存性注入を提供する対象:その他すべてのコンポーネント(Room、WorkManager など)。
  • Paging 3 が連携するもの:Room(データソースとして)と Navigation(無限リスト用)。

コメント