kotlin 如何处理已过时,在Java中已过时?

6ie5vjzr  于 2022-11-25  发布在  Kotlin
关注(0)|答案(1)|浏览(368)

我要使用的代码:

window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED)

在API 27中有一个被弃用的FLAG_SHOW_WHEN_LOCKED,它的替代setShowWhenLocked被添加到API 27中。如果我的项目中的minSdk是21,targetSdk是33,我应该如何正确使用它?
我收到警告is deprecated. Deprecated in Java
即使我这样处理:

if(Build.VERSION.SDK_INT >= 27) {
    setShowWhenLocked(true)
    setTurnScreenOn(true)
} else {
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}

我仍然得到警告。什么是正确的方式来支持旧的和新的API?

hs1ihplo

hs1ihplo1#

顶级域名

1.对不同的API版本使用不同的代码。
2.如果您正确处理了应用程序所针对的所有API版本,请忽略/抑制此警告
3.如果有一个新的替代方案,所有的API工作-使用它
说明
1.在条件中使用Build.VERSION.SDK_INT,以根据SDK_INT执行相应操作
1.如果SDK_INT>=27,则使用setshowwhenlocked;如果SDK_INT<27,则使用FLAG_SHOW_WHEN_LOCKED
1.抑制警告

FLAG_SHOW_WHEN_LOCKED/setShowWhenLocked的示例

if(Build.VERSION.SDK_INT >= 27) {
    setShowWhenLocked(true)
    setTurnScreenOn(true)
} else {
    @Suppress("DEPRECATION")
    window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)
}

但我们为什么要超越警告呢?
出现警告的原因是**@Deprecated API没有任何元数据来指示它们在哪个SDK中被弃用。**正如您在this issue中所看到的。我们可以抑制错误,因为我们已经正确处理了旧API(5-27)和新API(27〉)

警告

如果在使用正确API的情况下使用if条件无法正确处理代码,请不要抑制这些警告。

举例说明你不能做什么

@Suppress("DEPRECATION")
window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)

您的minSdk为21,targetSdk为33这段代码可以在使用5-27 API(Android 5 - Android 8. 1)的设备上运行,但不能在新设备上运行。您必须正确处理这两种情况。

Vibrator的示例

用老办法弄到振动器

context.getSystemService(VIBRATOR_SERVICE) as Vibrator

获得振动器的新方法

val vibrator = if (Build.VERSION.SDK_INT >= 31) {
    val vibratorManager =
        context.getSystemService(Context.VIBRATOR_MANAGER_SERVICE) as VibratorManager
    vibratorManager.defaultVibrator
} else {
    @Suppress("DEPRECATION")
    context.getSystemService(VIBRATOR_SERVICE) as Vibrator
}
Will show you the warning `'VIBRATOR_SERVICE: String' is deprecated. Deprecated in Java`. Go to the [documentation](https://developer.android.com/reference/kotlin/android/content/Context#vibrator_service) and see that this constant can be used in the API 1-31 so we must. And in both IDE and documentation there is the info about the alternative: `Deprecated: Use android.os.VibratorManager to retrieve the default system vibrator.`. As you can see the [VibrationManager](https://developer.android.com/reference/kotlin/android/os/VibratorManager) is added in the API 31 therefore we must write the different code for different sdk versions

如果替代项向后兼容

如果一个替代方案是向后兼容的,你可以使用它来代替旧的方式
示例
如果在Activity中继承AppCompatActivity

class SaveMyLifeActivity : AppCompatActivity()

如果调用startActivityForResult,则会遇到startActivityForResult(Intent!, Int): Unit' is deprecated. Deprecated in Java警告:

val intent = Intent(this, SaveMyLifeActivity::class.java)
startActivityForResult(intent, 0)

您可以按Alt+Q(默认键绑定)来查看Context info(在AndroidStudio中是这样调用的,您可以检查您的键Map)或使用网站来查看文档x1c 0d1x请注意,此方法已被弃用,您必须改用registerForActivityResult。此方法现在可以在任何版本中调用,文档中没有Added/Deprecated“部分”。

**问题:**您是如何找到此文档的?我在Google上搜索了AppCombatActivity startActivityForResult,找到了this文档。没有关于startActivityForResult的任何文字。
**答:**在IDE中打开有关此方法的上下文信息(Alt+Q),然后查看Context info

的底部。此方法位于(ComponentActivity)中,其中有一个类名。您必须使用google搜索ComponentActivity startActivityForResult,而不是AppCombatActivity startActivityForResult

相关问题