【问题标题】:What is the purpose of the condition "if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {" in the Firebase Cloud Messaging sample project?Firebase 云消息传递示例项目中条件“if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {”的目的是什么?
【发布时间】:2017-11-24 22:28:47
【问题描述】:

我正在实施 https://github.com/firebase/quickstart-android/tree/master/messaging 上提供的 Firebase 云消息传递快速入门示例项目,并将其合并到我的应用程序中。在https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MainActivity.java 我可以看到以下代码块:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // Create channel to show notifications.
    String channelId  = getString(R.string.default_notification_channel_id);
    String channelName = getString(R.string.default_notification_channel_name);
    NotificationManager notificationManager =
            getSystemService(NotificationManager.class);
    notificationManager.createNotificationChannel(new NotificationChannel(channelId,
            channelName, NotificationManager.IMPORTANCE_LOW));
}

使用条件if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){}的目的是什么?据我了解,Build.VERSION.SDK_INT 返回安装应用程序的设备的 API 级别,Build.VERSION_CODES.O 是我在 app/build.gradle 文件中定义为要编译的 API 级别,例如:@987654328 @。如果用户的设备的 API 级别低于我用来定义我正在编译的 SDK 版本的compileSdkVersion,代码是否要求不执行创建通道以显示通知的代码?我不明白这种情况的目的。顺便说一句,我正在使用 API 级别为 23 且符合预期的手机进行测试,因为我在我的 build.gradle 文件中使用了 compileSdkVersion 26,所以整个代码块都没有被执行。如果您能帮助澄清这段代码的目的,我将不胜感激,当然这不是我编写的代码。我是从https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MainActivity.java 那里得到的,但我正在努力理解它。谢谢。

【问题讨论】:

    标签: android push-notification firebase-cloud-messaging android-push-notification


    【解决方案1】:

    Build.VERSION.SDK_INT:

    The SDK version of the software currently running on this hardware device. 
    

    换句话说 - 这是运行应用程序的设备的 Android 版本。

    Build.VERSION_CODES.O - 是对 API 级别 26(Android Oreo 即 Android 8)的引用 https://developer.android.com/reference/android/os/Build.VERSION_CODES

    if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 为 TRUE - 表示运行应用程序的设备具有 Android SDK 26 或更高版本 - 并且您内部的代码块“if”语句将被执行。

    否则 - SDK 版本低于 26。(SDK 25 或更低)

    使用条件的目的是什么

    @CommonsWare 回答了这个问题

    【讨论】:

      【解决方案2】:

      使用条件的目的是什么

      为了避免在 Android 8.0 之前的设备上执行该代码块。 Android 8.0 中添加了通知渠道。尝试在旧设备上调用 createNotificationChannel() 会导致崩溃,因为该方法将不存在。

      这是一个标准的向后兼容配方。通常,实用程序类会隐藏这些东西(例如,SDK 中大多数名为 ...Compat 的类),但有时,就像这里的情况一样,我们可以自己做。

      如果用户的设备的 API 级别低于我用来定义我正在编译的 SDK 版本的 compileSdkVersion,代码是否要求不执行创建通道以显示通知的代码?

      是的。

      【讨论】:

        猜你喜欢
        • 2012-07-22
        • 2017-04-21
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多