画面遷移が複雑なAndroidアプリにどう対処したか

(メモレベルの雑文なので、読みづらいかもしれません)

やりたいこと

作っていたAndrodアプリの画面遷移が複雑なため、画面遷移を一望し、条件付きの分岐を行う仕組みを作りたい。

以下のようなIoT機器の設定アプリをイメージしてください

  • ある画面に出入りするパターンが複数ある
    • 同じ設定用の画面を使用するが、機器登録後の初期設定 または 設定の更新のいずれかによって画面遷移が異なる
    • 1つ目の機器登録か2つ目の機器登録かによって分岐

やったこと

以下を比較

1. archtecture component navigation を使用する

https://developer.android.com/topic/libraries/architecture/navigation/navigation-conditional

メリット

  • 画面遷移全体をGUIで俯瞰できる
  • 画面遷移の実装が比較的簡単

デメリット

  • 画面遷移の条件分岐の管理はarch navigationはやってくれない
  • argumentsをxmlで定義しなければならないのがちょっと嫌
  • 遷移方法の選定時点(2018/12)でalpha版だった。変更についてくコストがちょっとかかりそう

2. メルカリアッテを支えるオートマトンを参考にする

https://tech.mercari.com/entry/2017/11/17/161508

メリット

デメリット

  • TinderStateMachineのDSLの方が好み(雑)

留意点

3. Tinder StateMachine を使用する

https://github.com/Tinder/StateMachine

メリット

  • DSLが見やすくて良い

con

  • ステートマシンが現在のステートを持つ実装になっている
    • 画面を現在のステートとしたいので、ステートマシン自体に現在のステートを保持したくない(二重管理になってしまう)

検討結果

Tinder StateMachineの実装を参考にしつつ、現在のステートはステートマシンの外から取ってくるようにしました。

コード

https://gist.github.com/TomohikoSato/0c80441743d5aaddbdb3613cfdc3e316