Kotlin静态扩展功能Android

时间:2018-01-24 07:44:59

标签: android kotlin

我想为ConnectivityManager类中内置的Android创建一个扩展函数,以便我的项目中的任何类都可以静态使用它。我只使用Kotlin。

fun ConnectivityManager.checkInternet(context: Context): Boolean {
        val manager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val connection = manager.activeNetworkInfo
        if (connection != null && connection.isConnectedOrConnecting) {
            return true
        }
        return false
    }

我可以通过创建ConnectivityManager的对象来访问此功能,但我想要做的是静态使用它。有可能吗?

3 个答案:

答案 0 :(得分:4)

只有在您的类定义了companion对象时才可以这样做:

class MyClass {
    companion object { } 
}

fun MyClass.Companion.foo() {
}

就像伴随对象的常规成员一样,只能使用类名作为限定符来调用它们:

MyClass.foo()

不幸的是,Java类没有这样的companion个对象,这就是为什么你无法实现你想要的目标。

答案 1 :(得分:3)

这种扩展功能很可能不是你想要的。我可以看到两种方法来处理它。

创建顶级功能是单独的文件(例如network.kt)。

fun checkInternet(context: Context): Boolean{
    // perform check here
}

或者在上下文

上创建扩展方法
fun Context.checkInternet(): Boolean {
    val manager = this.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
    // I've "kotlinized" a bit your `if` statement
    return manager.activeNetworkInfo?.isConnectedOrConnecting ?: false
}

就个人而言,我更喜欢Context上的扩展方法。

答案 2 :(得分:0)

您的函数checkInternet被定义为您的班级ConnectivityManager的扩展函数。

如果您希望将函数checkInternet用作任何类的扩展方法,则可以执行以下操作:

  

fun Any.checkInternet(context: Context): Boolean { val manager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val connection = manager.activeNetworkInfo if (connection != null && connection.isConnectedOrConnecting) { return true } return false }

并导入您正在使用它的checkInternet函数。

否则,您可以将checkInternet作为ConnectivityManager中的静态成员,并将其用作静态函数。