onActivityResult() 已弃用 AppCompatActivity

问题描述 投票:0回答:3

我正在为 Android 使用应用内更新,并且根据文档,他们正在使用 onActivityResult 来处理应用程序行为,以防更新中断。

这是从我的片段调用的函数:

private fun startImmediateUpdate(appUpdateInfo: AppUpdateInfo) {
    appUpdateManager.startUpdateFlowForResult(
        appUpdateInfo,
        AppUpdateType.IMMEDIATE,
        requireActivity(),
        Constants.CODES.APP_UPDATE_REQUEST_CODE
    )

}

这就是我在家长活动中处理结果的方式

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    when (requestCode) {
        Constants.CODES.APP_UPDATE_REQUEST_CODE -> {
            if (resultCode != RESULT_OK || resultCode == RESULT_CANCELED || resultCode == ActivityResult.RESULT_IN_APP_UPDATE_FAILED) {
                //Do whatever i want to
            }
        }
    }
    super.onActivityResult(requestCode, resultCode, data)
}

现在 super.onActivityResult(requestCode, resultCode, data) 已弃用。 目前一切正常但我担心如果完全删除应用程序会崩溃

我可以做什么来替换 onActivityResult()?我查看了 registerForActivityResult() 但找不到适合我用例的任何内容。

android kotlin onactivityresult
3个回答
6
投票

正如 Ian Lake 提到的 有一个使用 IntentSenderForResultStarter 的解决方案。

首先在您的活动中,创建一个ActivityResultLauncher

private val updateFlowResultLauncher =
    registerForActivityResult(
        ActivityResultContracts.StartIntentSenderForResult(),
    ) { result ->
        if (result.resultCode == RESULT_OK) {
            // Handle successful app update
        }
    }

现在开始更新流程如下:

fun startUpdate(
    appUpdateInfo: AppUpdateInfo,
    requestCode: Int,
) {
    val starter =
        IntentSenderForResultStarter { intent, _, fillInIntent, flagsMask, flagsValues, _, _ ->
            val request = IntentSenderRequest.Builder(intent)
                .setFillInIntent(fillInIntent)
                .setFlags(flagsValues, flagsMask)
                .build()

            updateFlowResultLauncher.launch(request)
        }

    appUpdateManager.startUpdateFlowForResult(
        appUpdateInfo,
        AppUpdateType.FLEXIBLE,
        starter,
        requestCode,
    )
}

5
投票

我有同样的问题,我看到一种可能性是重写以使用 startUpdateFlow 调用 代替。

就个人而言,我认为这不值得做,所以我会忽略这个特定的弃用警告,并等待/希望 Android/Google 制定一个我们可以传递

ActivityResultLauncher
的方法。


-1
投票

新方式

    appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
        if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE
            && (appUpdateInfo.clientVersionStalenessDays() ?: -1) >= 2
            && appUpdateInfo.updatePriority() >= updatePriority
            && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)
        ) {
            appUpdateManager.startUpdateFlowForResult(
                appUpdateInfo,
                AppUpdateType.IMMEDIATE,
                this,
                updateCode
            )
            openActivityForResult()
        }
    }
}

private fun openActivityForResult(){
    resultUpdate.launch(Intent(this, MainActivity::class.java))
}

var resultUpdate = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result->
    if (result.resultCode != Activity.RESULT_OK){
        Toast.makeText(
            this,
            "App Update failed, please try again on the next app launch.",
            Toast.LENGTH_SHORT
        ).show()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.