当前位置: 首页 > 知识库问答 >
问题:

动态功能活动未加载,安装时卡住

鲁成天
2023-03-14

以下链接可供参考。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"

共有1个答案

韶云瀚
2023-03-14

根据文档,您还需要启用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(){