Androidアプリケーション内のナビゲーション

はじめに



Android開発では、さまざまなアーキテクチャソリューション(パターン)を使用します。 たとえば、 MvpMvvmMviなど。これらのパターンはそれぞれいくつかの重要な問題を解決しますが、完全ではないため、いくつかの未解決の問題が残ります。 たとえば、これらのタスクには、アプリケーション内の移動(ルーティング)、画面から画面への情報の転送(画面を話す、アクティビティ、フラグメント、またはビューを意味します)、構成の変更時のアプリケーションの状態の保存(構成の変更)が含まれます。







当社では、これらの問題にも直面しましたが、いくつかは簡単な方法で解決されましたが、最初の問題は特定の解決策を見つけられませんでした。さまざまな解決方法を試した後、独自のFlowzardライブラリを作成しました。







挑戦する



当社では、 Mvpアーキテクチャを使用しています。 画面間でデータを表示、変更、および転送する際に最大限の柔軟性を持たせるために、 単一責任原則と呼ばれる原則に従うようにしています。 原則は、各モジュールが特定の問題を解決する必要があると述べています。 この場合、画面はグローバルタスクから分離し、情報の表示/受信という特定のタスクを解決する必要があります。 彼は他の画面についてはまったく知らないはずです。 したがって、最大限の柔軟性を実現できます。 以下は、ライブラリのセットアップと使用の例です。







フローザード



フローを作成する







class MainFlow(flowManager: FlowManager) : Flow(flowManager) { //      flow override fun onCreate(savedInstance: DataBunch?, data: DataBunch?) { super.onCreate(savedInstance, data) } }
      
      





フローナビゲーターを作成する







ナビゲーターは次の2つの機能を実行します。







 class DefaultFlowNavigator(activity: AppCompatActivity) : SimpleFlowNavigator(activity){ //    flow  Activity override fun getActivityIntent(id: String, data: Any?): Intent { return when (id) { Flows.SIGN_UP -> Intent(activity, SignupActivity::class.java) else -> throw RuntimeException("Cannot find activity for id=$id") } } }
      
      





アクティビティにスナップ







ActivityをFlowに関連付けるために、FlowActivityを継承し、Navigator、この場合はDefaultFlowNavigatorを提供します。







 class MainActivity : FlowActivity() { override val navigator: Navigator get() = DefaultFlowNavigator(this) }
      
      





FlowManagerを作成する







 class DefaultFlowManager : FlowManager() { //    (main) flow override fun createMainFlow(): Flow { return MainFlow(this) } //    flow override fun createFlow(id: String): Flow { return when (id) { Flows.SIGN_UP -> SignupFlow(this) else -> throw RuntimeException("Cannot find flow for id=$id") } } } //   FlowManager  Application class App : Application(), FlowManagerProvider { private val flowManager = DefaultFlowManager() override fun getProvideManager(): FlowManager { return flowManager } }
      
      





フローと画面間のメッセージング







ログインボタンをクリックすると、アクティビティはメインフローにメッセージを送信します。 フローはSIGN_UPフローを作成し、それからの応答を待ちます。 ログインに成功すると、SIGN_UPフローは結果をメインフローに送信し、onFlowResult:MainFlowがコードと結果オブジェクトとともに呼び出されます。 メインフローは結果が正しいかどうかをチェックし、ユーザーが正常にログインしたというメッセージをアクティベーションに送り返します。







 class MainFlow(flowManager: FlowManager) : Flow(flowManager) { companion object { const val LOGIN_REQUEST_CODE = 1 } //     override fun onMessage(code: String, message: Any) { super.onMessage(code, message) if (code == "main" && message == "login") { newFlow(Flows.SIGN_UP, LOGIN_REQUEST_CODE) } } //       flow override fun onFlowResult(requestCode: Int, result: Result) { super.onFlowResult(requestCode, result) if (requestCode == LOGIN_REQUEST_CODE && result is Result.SUCCESS) { sendMessageFromFlow("main", true) } } } class MainActivity : FlowActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) loginButton.setOnClickListener { //   “login”   “main” flow.sendMessage("main", "login") } //     “main” setMessageListener("main") { if (it is Boolean && it) { statusTextView.text = "Logined" } } } }
      
      





構成の変更時またはプロセスがオペレーティングシステムを停止したときの状態の保存



Androidはアクティビティスタックとフラグメントスタックを保存するため、これらのコンテナで作成されたフローは状態を保存および復元します。 ライブラリにはまだそのようなマネージャがないため、Viewコンテナでは、カスタムFlowManagerを記述する必要があります。 次の更新では、フローから中間データを保存する機能が追加されます。







この記事では多くのコードが必要ないため、この例に限定します。 ライブラリの詳細な研究のためのリポジトリへのリンクはこちらです。








All Articles