我想为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
的对象来访问此功能,但我想要做的是静态使用它。有可能吗?
答案 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
中的静态成员,并将其用作静态函数。