如何在即时应用程序中包含即时动态功能模块?
How to include instant dynamic feature module in instant app?
我有一个包含这些模块的项目:
app
bookingfeature
(即时启用)
map
(不是即时的)
app
包含一些通用代码和资源,以及一个起始 activity,其中包含一些逻辑,可根据它是否 运行 立即将应用程序路由到正确的目的地.
bookingfeature
包含一个 activity 和一些我想用免安装应用程序部署的片段。
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" />
编辑:
当我从 activity 中删除 finish()
时,它实际上会启动 BookingActivity 并安装功能模块。但这并不是我想要的。我希望在下载即时应用程序时包含该模块。
我遇到了完全相同的问题,这个选项“部署为即时应用程序”毁了我几个小时。
无论如何,我通过在即时模块的清单中添加 CATEGORY_LAUNCHER 来摆脱它(bookingfeature 在你的情况下)。
您必须从 基本模块清单 中删除 CATEGORY_LAUNCHER 并且仅将其添加到 即时模块清单 中,否则它会显示使用 Playstore 上的“安装”按钮安装应用程序时的两个应用程序图标。
现在,当您使用“立即尝试”时,它会打开设置为启动器的即时模块 activity,您可以从这个 activity 检查它是否 运行 作为启动器是否安装即时应用程序并启动基本模块 activity.
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 并在此 activity 中你将检查它是否 运行 作为即时应用程序 -
val instantApp = InstantApps.getPackageManagerCompat(this).isInstantApp()
if(!instantApp) {
// start base module activity
// finish() this activity
}
希望这对您有所帮助,如果您有任何 suggestion/any 其他修复方法,请发表评论。
我有一个包含这些模块的项目:
app
bookingfeature
(即时启用)map
(不是即时的)
app
包含一些通用代码和资源,以及一个起始 activity,其中包含一些逻辑,可根据它是否 运行 立即将应用程序路由到正确的目的地.
bookingfeature
包含一个 activity 和一些我想用免安装应用程序部署的片段。
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" />
编辑:
当我从 activity 中删除 finish()
时,它实际上会启动 BookingActivity 并安装功能模块。但这并不是我想要的。我希望在下载即时应用程序时包含该模块。
我遇到了完全相同的问题,这个选项“部署为即时应用程序”毁了我几个小时。 无论如何,我通过在即时模块的清单中添加 CATEGORY_LAUNCHER 来摆脱它(bookingfeature 在你的情况下)。
您必须从 基本模块清单 中删除 CATEGORY_LAUNCHER 并且仅将其添加到 即时模块清单 中,否则它会显示使用 Playstore 上的“安装”按钮安装应用程序时的两个应用程序图标。
现在,当您使用“立即尝试”时,它会打开设置为启动器的即时模块 activity,您可以从这个 activity 检查它是否 运行 作为启动器是否安装即时应用程序并启动基本模块 activity.
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 并在此 activity 中你将检查它是否 运行 作为即时应用程序 -
val instantApp = InstantApps.getPackageManagerCompat(this).isInstantApp()
if(!instantApp) {
// start base module activity
// finish() this activity
}
希望这对您有所帮助,如果您有任何 suggestion/any 其他修复方法,请发表评论。