【问题标题】:How to include instant dynamic feature module in instant app?如何在即时应用中包含即时动态功能模块?
【发布时间】:2021-01-11 14:24:36
【问题描述】:

我有一个包含这些模块的项目:

  • app
  • bookingfeature(即时启用)
  • map(不是即时的)

app 包含一些通用代码和资源以及一个带有一些逻辑的启动 Activity,用于根据应用是否即时运行将应用路由到正确的目的地。

bookingfeature 包含一个活动和一些我想与免安装应用一起部署的片段。

map 包含应用程序的其余部分(正在进行中以将其拆分为更多模块)

如果我在 android studio 中像这样部署它,一切正常:

如果我取消选中 bookingfeature 的复选框,显然它将不起作用,因为该功能不存在。

当我创建一个应用程序包并将其上传到 Play 商店,然后在 Play 商店中点击“立即尝试”时,它的行为就像 bookingfeature 未勾选。

我可以让它表现得像bookingfeature 被勾选,以某种方式将它包含在app 模块中吗?还是我必须将所有代码从bookingfeature 移到app

“立即尝试”按钮是否只运行app模块,有没有办法改变它?


app清单:

<manifest …>
<dist:module dist:instant="true" />

<application
   …
   android:name=“.App”>

    <activity
        android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


bookingfeature清单:

<manifest ...>

    <dist:module
        dist:instant="true"
        dist:title="@string/title_bookingfeature">
        <dist:delivery>
            <dist:install-time />
        </dist:delivery>
        <dist:fusing dist:include="false" />
    </dist:module>
    <application>
        <activity
            android:name=".booking.view.BookingActivity"/>
    </application>
</manifest>

MainActivity:

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil
            .setContentView(this, R.layout.activity_main)

        if (isInstantApp(this)) {
            findNavController(R.id.main_nav_host).navigate(R.id.booking_activity)
        } else {
            findNavController(R.id.main_nav_host).navigate(R.id.splash_activity)
        }
        finish()
    }
}

navigation:

...
<activity
   android:id="@+id/booking_activity"
   android:name="x.x.x.booking.view.BookingActivity"
   app:moduleName="bookingfeature" />

<activity
    android:id="@+id/splash_activity"
    android:name="x.x.map.splash.SplashActivity"
    app:moduleName="map" />

编辑:

当我从活动中删除finish() 时,它实际上会启动 BookingActivity 并安装功能模块。但这并不是我想要的。我希望在下载免安装应用时包含该模块。

【问题讨论】:

    标签: android dynamic module instant


    【解决方案1】:

    我遇到了完全相同的问题,这个选项“部署为即时应用程序”破坏了我的几个小时。 无论如何,我通过在即时模块的清单中添加 CATEGORY_LAUNCHER 来摆脱它(bookingfeature 在你的情况下)。

    您必须从 基本模块清单 中删除 CATEGORY_LAUNCHER 并仅将其添加到 即时模块清单 中,否则在使用“安装”按钮安装应用程序时会显示两个应用程序图标在 Playstore 上。

    现在,当您使用“立即尝试”时,它将打开您设置为启动器的即时模块活动,您可以从该活动中检查它是否作为即时应用程序运行并启动基本模块活动。

    Instant Module Activity will look like this -
        <activity
                    android:name=".booking.view.BookingActivity">
        <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
        </activity>
    

    当您使用 Playstore 上的“安装”按钮安装应用程序时,它还会下载即时模块和基本模块。 所以现在它会启动这个即时模块的 BookingActivity 并在这个活动中检查它是否作为即时应用程序运行 -

    val instantApp = InstantApps.getPackageManagerCompat(this).isInstantApp()
    if(!instantApp) {
     // start base module activity
    // finish() this activity
    }
    

    希望这会有所帮助,如果您有任何建议/任何其他解决方法,请发表评论。

    【讨论】:

    • 感谢您的详细解答。看起来我们只能包含一个功能模块?这就是具有启动器活动的功能?我不久前放弃了这个项目,但我相信这对未来会有帮助。
    • 我们可以有多个即时功能模块,但只有一个即时功能模块可以有启动器活动,其他可以定义 url 链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多