Почему обновления в приложении не обновляют приложение должным образом?

#android #kotlin #in-app-update

Вопрос:

Ниже приведен код внутри моего 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
                amp;amp; appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
            ) {
                appUpdateManager.startUpdateFlowForResult(
                    appUpdateInfo, AppUpdateType.IMMEDIATE, this, updateRequestCode
                )
            }
        }

    }

}
 

Редактировать:

Я перешел postDelayed к тому addOnSuccessListener , fun callInAppUpdate() что теперь выглядит следующим образом.

     private fun callInAppUpdate() {

    val appUpdateManager = AppUpdateManagerFactory.create(this)
    val appUpdateInfoTask = appUpdateManager.appUpdateInfo
    appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            amp;amp; 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
            )
        }
    }

}
 

Ответ №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
            amp;amp; appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
            appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo, AppUpdateType.IMMEDIATE, this, updateRequestCode
            )
        }
        else {
            navigate()
        }
    }

  }
}
 

Ответ №2:

У вас есть навигационная логика внутри postDelayed . Вы явно переходите к новому действию через 2500 мс. Таким образом, код делает именно то, что вы написали.

Если вы хотите перейти после проверки наличия обновления, вам, вероятно, следует переместить логику навигации addOnSuccessListener в, хотя это тоже похоже на взлом. В любом случае я бы не стал делать эту проверку на заставке, но на каком-нибудь более «статичном» экране, на котором нет навигации по установленному таймеру

Комментарии:

1. Я перешел postDelayed к addOnSuccessListener , пожалуйста, посмотрите на мой вопрос после EDIT . Правильно ли я поступил сейчас и является ли это неправильным подходом?

2. Я бы не стал проверять наличие обновлений на экране, но в противном случае я думаю, что это должно сработать для вас