このページでは、アーキテクチャのベスト プラクティスと推奨事項をいくつか紹介します。 これらを採用することで、アプリの品質、堅牢性、スケーラビリティを向上できます。また、アプリのメンテナンスとテストも容易になります。
UI レイヤ
UI レイヤの役割は、アプリデータを画面に表示することであり、ユーザー インタラクションの主要なポイントとして機能することです。UI レイヤのベスト プラクティスは次のとおりです。
- リポジトリは、データソースが 1 つだけの場合でも作成する必要があります。
- 小規模なアプリでは、
dataパッケージやモジュール内にデータレイヤ タイプを配置できます。
おすすめの活動 |
説明 |
単方向データフロー(UDF)に従います。 強く推奨 |
単方向データフロー(UDF)の原則に従い、ViewModel はオブザーバー パターンを使用して UI の状態を公開し、メソッド呼び出しを介して UI からアクションを受け取ります。 |
メリットをアプリに適用できる場合は、AAC ViewModel を使用します。 強く推奨 |
AAC ViewModel を使用して ビジネス ロジックを処理し、アプリデータを取得して UI の状態を UI に公開します。 詳しくは、ViewModel のベスト プラクティスをご覧ください。 ViewModel のメリットについては、こちらをご覧ください。 |
ライフサイクル対応 UI 状態コレクションを使用します。 強く推奨 |
適切なライフサイクル対応コルーチン ビルダー
|
ViewModel から UI にイベントを送信しないようにします。 強く推奨 |
ViewModel でイベントをすぐに処理し、イベント処理の結果で状態を更新します。UI イベントについて詳しくは、こちらをご覧ください。 |
単一アクティビティのアプリケーションを使用します。 推奨 |
アプリに複数の画面がある場合、Navigation フラグメントを使用して画面間を移動し、アプリへのディープリンクを設定します。 |
次のスニペットは、ライフサイクル対応の方法で UI の状態を収集する方法を示しています。
class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModel()
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycleScope.launch {
viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
viewModel.uiState.collect {
// Process item
}
}
}
}
}
ViewModel
ViewModel は、UI の状態とデータレイヤへのアクセスを提供する役割を担います。ViewModel に関するベスト プラクティスは次のとおりです。
おすすめの活動 |
説明 |
ViewModel が、Android のライフサイクルに依存しないようにします。 強く推奨 |
ViewModel が、ライフサイクルに関連する型への参照を保持しないようにします。 |
コルーチンと Flow を使用します。 強く推奨 |
ViewModel は、以下を使用してデータレイヤまたはドメインレイヤとやり取りします。
|
画面レベルで ViewModel を使用します。 強く推奨 |
再利用可能な UI で ViewModel を使用しないようにします。ViewModel は、以下で使用します。
|
強く推奨 |
|
UI 状態を公開します。 推奨 |
ViewModel が、
|
次のスニペットは、ViewModel から UI の状態を公開する方法を示しています。
@HiltViewModel
class BookmarksViewModel @Inject constructor(
newsRepository: NewsRepository
) : ViewModel() {
val feedState: StateFlow<NewsFeedUiState> =
newsRepository
.getNewsResourcesStream()
.mapToFeedState(savedNewsResourcesState)
.stateIn(
scope = viewModelScope,
started = SharingStarted.WhileSubscribed(5_000),
initialValue = NewsFeedUiState.Loading
)
// ...
}
ライフサイクル
Android のライフサイクルを扱う際のベスト プラクティスは次のとおりです。
推奨事項 |
説明 |
アクティビティやフラグメントのライフサイクル メソッドをオーバーライドしないようにします。 強く推奨 |
アクティビティやフラグメントの |
次のスニペットは、特定のライフサイクル状態でオペレーションを行う方法を説明したものです。
class MyFragment: Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
override fun onResume(owner: LifecycleOwner) {
// ...
}
override fun onPause(owner: LifecycleOwner) {
// ...
}
}
}
}