ShihoChan I/O

しほちゃんのブログ

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

  • 各画面への遷移は 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を利用した遷移を検討予定