以下链接可供参考。https://github.com/googlesamples/android-dynamic-features
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.util.Log
import android.view.View
import android.widget.ProgressBar
import android.widget.TextView
import com.google.android.play.core.splitinstall.*
import com.google.android.play.core.splitinstall.model.SplitInstallSessionStatus
import com.lenskart.app.R
private const val modulePackageName = "com.test.feature"
private const val htoClassname = "$modulePackageName.hto.HtoActivity"
private const val atHomeClassname = "$modulePackageName.athome.AtHomeActivity"
class BundleActivity : AppCompatActivity() {
private val listener = SplitInstallStateUpdatedListener { state ->
val multiInstall = state.moduleNames().size > 1
state.moduleNames().forEach { name ->
when (state.status()) {
SplitInstallSessionStatus.DOWNLOADING -> {
displayLoadingState(state, "Downloading $name")
}
SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION -> {
startIntentSender(state.resolutionIntent().intentSender, null, 0, 0, 0)
}
SplitInstallSessionStatus.INSTALLED -> {
displayLoadingState(state, "Installed $name")
onSuccessfulLoad(name, launch = !multiInstall)
}
SplitInstallSessionStatus.INSTALLING -> displayLoadingState(state, "Installing $name")
SplitInstallSessionStatus.FAILED -> {
Log.e(TAG, "Error: ${state.errorCode()} for module ${state.moduleNames()}")
}
SplitInstallSessionStatus.CANCELED -> displayLoadingState(state, "Cancelled $name")
SplitInstallSessionStatus.UNKNOWN -> displayLoadingState(state, "Unknown thingy $name")
SplitInstallSessionStatus.PENDING -> displayLoadingState(state, "Pending $name")
}
}
}
private val moduleHto by lazy { "hto" }
private val moduleAtHome by lazy { "athome" }
private lateinit var manager: SplitInstallManager
private lateinit var progressBar: ProgressBar
private lateinit var progressText: TextView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_bundle)
manager = SplitInstallManagerFactory.create(this)
initializeViews()
loadAndLaunchModule(moduleAtHome)
}
override fun onResume() {
manager.registerListener(listener)
super.onResume()
}
override fun onPause() {
manager.unregisterListener(listener)
super.onPause()
}
private fun loadAndLaunchModule(name: String) {
updateProgressMessage("Loading module $name")
if (manager.installedModules.contains(name)) {
updateProgressMessage("Already installed")
onSuccessfulLoad(name, launch = true)
return
}
val request = SplitInstallRequest.newBuilder()
.addModule(name)
.build()
manager.startInstall(request)
updateProgressMessage("Starting install for $name")
}
private fun onSuccessfulLoad(moduleName: String, launch: Boolean) {
if (true) {
when (moduleName) {
moduleHto -> launchActivity(htoClassname)
moduleAtHome -> launchActivity(atHomeClassname)
}
}
displayButtons()
}
private fun launchActivity(className: String) {
Intent().setClassName(packageName, className)
.also {
startActivity(it)
}
}
private fun displayLoadingState(state: SplitInstallSessionState, message: String) {
displayProgress()
progressBar.max = state.totalBytesToDownload().toInt()
progressBar.progress = state.bytesDownloaded().toInt()
updateProgressMessage(message)
}
private fun initializeViews() {
progressBar = findViewById(R.id.progress_bar)
progressText = findViewById(R.id.progress_text)
}
private fun updateProgressMessage(message: String) {
if (progressText.visibility != View.VISIBLE &&
progressBar.visibility != View.VISIBLE) displayProgress()
progressText.text = message
}
private fun displayProgress() {
progressText.visibility = View.VISIBLE
progressBar.visibility = View.VISIBLE
}
private fun displayButtons() {
progressText.visibility = View.GONE
progressBar.visibility = View.GONE
}
}
private const val TAG = "DynamicFeatures"
根据文档,您还需要启用SplitCompat。您有三种选择:
>
选项1:通过在AndroidManifest.xml中定义SplitCompatApplication作为默认应用程序
<application
...
android:name="com.google.android.play.core.splitcompat.SplitCompatApplication" >
</application>
选项2:让您当前的应用程序类扩展SplitCompatApplication。
public class MyApplication extends SplitCompatApplication {
...
}
@Override
protected void attachBaseContext(Context context) {
super.attachBaseContext(context);
// Emulates installation of future on demand modules using SplitCompat.
SplitCompat.install(this);
}
来源
1596788538.956 20445-20445/com.tscore.app I/PlayCore:uid:[10198]PID:[20445]SplitInstallService:startInstall([aadhar_module],[])1596788538.957 20445-21761/com.tscore.app I/PlayCore:uid:[10198]PID:[2044
4个示例中有2个在CodePen和本地html文件中不适合我。在“导航”示例中,下拉菜单中的项目保持活动状态,单击方式后不能再次访问。垂直选项卡中的所有项也是如此:https://codepen.io/dannyjoris/pen/mvqmew CSS: https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/c
本文向大家介绍virtualbox安装增强功能时【未能加载虚拟光盘】的问题解决,包括了virtualbox安装增强功能时【未能加载虚拟光盘】的问题解决的使用技巧和注意事项,需要的朋友参考一下 今天在使用Virtualbox中的Ubuntu虚拟机,想安装增强功能来实现更改分辨率,但是在安装时出错:未能加载虚拟光驱 VBoxsGuestAdditions.iso到虚拟电脑 经过折腾,最后通过互联网找到
问题内容: 上周,我了解到可以通过编写函数将类包含在您的项目中。然后我了解到,使用自动加载器不仅是一种技术,而且是一种模式。 现在,我在项目中使用了自动加载器,并且发现它非常有用。我想知道是否有可能用函数做同样的事情。忘记包含正确的PHP文件以及其内部的功能可能对您很有用。 那么,是否可以创建函数自动加载器? 问题答案: 没有用于功能的功能自动加载器。您有四个可行的解决方案: 将所有函数包装到命名
问题内容: 我正在尝试为我的网站创建页面主题功能。我想使用单独的CSS文件在页面上动态加载相应的主题。 我正在使用此代码: 效果很好,但是如果CSS文件未加载,它不会返回任何信息。 加载时,有什么方法可以捕捉吗?也许通过使用ajax? 问题答案: 加载CSS文件(或其任何其他更改)时,Internet Explorer会触发一个事件。其他浏览器不会触发任何事件,因此您将必须手动检查样式表是否已加载
说明 调用方法: $.f2e.util.getScript(url,cache,fn); 函数说明: 加载js,并提供相关回调 参数说明: 参数名 类型 说明 备注 url string 地址 无 cache boolean 缓存 无 fn function 回调函数 无 脚本 <script> $.f2e.util.getScript(url,true,function(){