Plaidでの画面遷移
しほちゃんです。
前のブログ続きです。
今回はDynamic Feature Moduleを採用しているPlaidがどのように画面遷移を実現しているのかをまとめます。
Dynamic Feature Moduleでの画面遷移の難しさ
- 依存関係が一般的なアプリの依存関係とは逆になる
- 各featureモジュールがappモジュールを知っている
- appモジュールがが各featureを知ることができないので、
Intent(ACTION_VIEW, ActivityName::class.java)
を利用してclass名指定でのactivity起動ができない
Plaidでの実装方法
- 遷移のための
AddressableActivity
interfaceを作成
/** * An [android.app.Activity] that can be addressed by an intent. */ interface AddressableActivity { /** * The activity class name. */ val className: String }
- 各画面への遷移は
AddressableActivity
を継承してパッケージからの絶対パスでクラス名を指定する - 更に下記に示す
intentTo(addressableActivity: AddressableActivity): Intent
メソッドを利用して遷移のためのIntentを作成する
/** * Create an Intent with [Intent.ACTION_VIEW] to an [AddressableActivity]. */ fun intentTo(addressableActivity: AddressableActivity): Intent { return Intent(Intent.ACTION_VIEW).setClassName( PACKAGE_NAME, addressableActivity.className) }
intentTo(addressableActivity: AddressableActivity): Intent
IntentExtra
を含まない最も簡単な例は下記のようにclassName
プロパティのみを持つものになる
/** * Base object for DesignerNews activities. */ object DesignerNews { /** * DesignerNews LoginActivity */ object Login : AddressableActivity { override val className = "$PACKAGE_NAME.designernews.ui.login.LoginActivity" } ~~~~ }
まとめ
- Dynamic Feature Module構成のアプリではappモジュールが遷移できる画面を知らないのでどうしても文字列などの指定で遷移しなければならない
- Plaidではinterfaceとユーティリティメソッドを利用して遷移を行う
- 参考:ActivityHelper.kt
- 次回はJetpackのnavigationを利用した遷移を検討予定