根据官方文档,Android的版本名称 android.os.VERSION.versionName 可能是 "4.4" 也可能是 “4.4a” 这种带字母的,对这种包含点需要进行比较
注意下面几点
- 对字母比较之前要进行数字比较,当抛出格式一场时进行字母的unicode比较
- 对小数点
.
分离出来的数组要最长的那个要进行比较,才能避免 4.0 和 4 是相同的情况 - 要对可能出现的数组种空的情况做判断
- kotlin 里面 until 而不是 .. 防止IndexOutOfBoundsException
fun compareVersion(version1: String, version2: String): Int{
if (version1 == version2) {
return 0
}
val version1Array = version1.trim().split(".")
val version2Array = version2.trim().split(".")
var index = 0
var minLen = Math.min(version1Array.size, version2Array.size)
var diff = 0
while(index < minLen) {
try {
diff = version1Array[index].toInt() - version2Array[index].toInt()
} catch (e: NumberFormatException) {
diff = version1Array[index].compareTo(version2Array[index])
}
if (diff != 0) {
break
}
index++
}
if (diff == 0) {
if (version1Array.size > minLen) {
for (i in index until version1Array.size) {
try {
if (version1Array[i].isNotBlank() && version1Array[i].toInt()> 0) {
return 1
}
} catch (e: NumberFormatException) {
return 1
}
}
for (i in index until version2Array.size) {
try {
if (version2Array[i].isNotBlank() && version2Array[i].toInt()> 0) {
return -1
}
} catch (e: NumberFormatException) {
return -1
}
}
} else {
}
} else {
return if(diff > 0) 1 else -1
}
return 0
}