【问题标题】:Why is In-app updates doesn't update the app as expected?为什么应用内更新没有按预期更新应用?
【发布时间】:2021-10-12 08:05:52
【问题描述】:

以下是我的SplashActivity.kt 中的代码。每当有可用更新时,大多数情况下它根本不会显示,但我认为这不是因为我的代码中有任何错误,而是因为我了解到需要一些时间来向用户展示新更新。我现在担心的是,当它显示应用内更新屏幕时,它会关闭并且应用程序会继续下一个屏幕,并且不会要求用户更新应用程序以继续使用该应用程序。我是不是搞错了?

    @Suppress("DEPRECATION")
class SplashActivity : AppCompatActivity() {

    private lateinit var binding: ActivitySplashBinding

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

        binding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(binding.root)

        callInAppUpdate()
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )
        Handler().postDelayed(
            {
                val currentUserID = FirestoreClass().getCurrentUserID()

                if (currentUserID.isNotEmpty()) {
                    startActivity(Intent(this@SplashActivity, HomeActivity::class.java))
                } else {
                    startActivity(
                        Intent(
                            this@SplashActivity,
                            LoginActivity::class.java
                        )
                    )
                }
                finish()
            },
            2500
        )
    }

    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (data == null) return

        if (requestCode == updateRequestCode) {
            Toast.makeText(this, "Downloading", Toast.LENGTH_SHORT).show()

            if (resultCode != RESULT_OK) {
                Log.d("TAG", "update flow failed $resultCode")
            }
        }
    }

    private val updateRequestCode = 1612

    private fun callInAppUpdate() {

        val appUpdateManager = AppUpdateManagerFactory.create(this)
        val appUpdateInfoTask = appUpdateManager.appUpdateInfo
        appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
            if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
            ) {
                appUpdateManager.startUpdateFlowForResult(
                    appUpdateInfo, AppUpdateType.IMMEDIATE, this, updateRequestCode
                )
            }
        }

    }

}

编辑:

我将postDelayed 移至addOnSuccessListenerfun callInAppUpdate() 现在如下所示。

    private fun callInAppUpdate() {

    val appUpdateManager = AppUpdateManagerFactory.create(this)
    val appUpdateInfoTask = appUpdateManager.appUpdateInfo
    appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
        ) {
            appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo, AppUpdateType.IMMEDIATE, this, updateRequestCode
            )
        }else{
            Handler().postDelayed(
                {
                    val currentUserID = FirestoreClass().getCurrentUserID()

                    if (currentUserID.isNotEmpty()) {
                        startActivity(Intent(this@SplashActivity, DashboardActivity::class.java))
                    } else {
                        startActivity(
                            Intent(
                                this@SplashActivity,
                                LoginWithPhoneNumberActivity::class.java
                            )
                        )
                    }
                    finish()
                },
                2500
            )
        }
    }

}

【问题讨论】:

    标签: android kotlin in-app-update


    【解决方案1】:

    您可以实现如下行为:

    class SplashActivity : AppCompatActivity() {
    
    private val updateRequestCode = 1612
    
    private lateinit var binding: ActivitySplashBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        binding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(binding.root)
    
        callInAppUpdate()
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )
    
    }
    
    public override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (data == null) return
    
        if (requestCode == updateRequestCode) {
            Toast.makeText(this, "Downloading", Toast.LENGTH_SHORT).show()
            if (resultCode != RESULT_OK) {
                Log.d("TAG", "update flow failed $resultCode")
                navigate()
            }
        }
    }
    
    private fun navigate(){
        Handler().postDelayed(
            {
                val currentUserID = FirestoreClass().getCurrentUserID()
    
                if (currentUserID.isNotEmpty()) {
                    startActivity(Intent(this@SplashActivity, DashboardActivity::class.java))
                } else {
                    startActivity(
                        Intent(
                            this@SplashActivity,
                            LoginWithPhoneNumberActivity::class.java
                        )
                    )
                }
                finish()
            },
            2500
        )
    }
    
    
    
    private fun callInAppUpdate() {
    
        val appUpdateManager = AppUpdateManagerFactory.create(this)
        val appUpdateInfoTask = appUpdateManager.appUpdateInfo
        appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
            if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
                && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
                appUpdateManager.startUpdateFlowForResult(
                    appUpdateInfo, AppUpdateType.IMMEDIATE, this, updateRequestCode
                )
            }
            else {
                navigate()
            }
        }
    
      }
    }
    

    【讨论】:

      【解决方案2】:

      postDelayed 中有导航逻辑。您在 2500 毫秒后明确导航到新活动。所以代码完全按照你写的那样做。

      如果您想在检查更新后进行导航,那么您可能应该将导航逻辑移至 addOnSuccessListener,尽管它看起来也像是一个 hack。无论哪种方式,我都不会在启动屏幕中进行此检查,而是在一些没有设置计时器导航的“静态”屏幕中进行检查

      【讨论】:

      • 我把postDelayed移到了addOnSuccessListener,请看EDIT后面我的问题。我现在做对了吗?这是一种错误的方法吗?
      • 我不会检查 SplashScreen 上的更新,否则我认为它应该适合你
      猜你喜欢
      • 1970-01-01
      • 2012-03-04
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多