1. 自定义需要注入Webiew的JavascriptObject:
// 继承Object基类
class JavascriptObject: Object(){
public fun doBefore(arg: Any?){
}
// 注解1
@JavascriptInterface
public fun do(arg: String?){
}
}
2. 往Webiew注入Javascript Interface类:
// 注解2
@SuppressLint("JavascriptInterface")
private fun addJavascriptInterfaceObject(){
val object1 = JavascriptObject()
// 自定义参数: arg
lateinit var arg: Any?
object1.doBefore(arg)
// 自定义调用的Javascript Interface类JavascriptObject的别名——在Javascript调用中使用的名称
webView.addJavascriptInterface(object1, "jsio")
}
3. 在Javascript中调用Javascript Interface类JavascriptObject方法do(arg: String?):
// 自定义传入参数arg
lateinit var arg: String?
var html: String = """<!DOCTYPE html><html><head><title>Test</title>
</head>
<body>"""
html += """<a href='javascript:window.jsio.do(\"$arg\");'><img width='36px' height='36px' src='file:///android_asset/trash.png' alt='DELETE'/></a>
</body>
</html>"""
如果不需要混淆该类可以在build.gradle (:app)文件定义的规则文件
proguard-rules.pro或
proguard-android-optimize.txt
中进行注释。
gradle.build (:app):
android {
compileSdkVersion 30
buildToolsVersion "31.0.0"
defaultConfig {
applicationId "com.mr.n.x"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
proguard-rules.pro:
-keep class androidx.annotation.Keep
给之前自定义的Javascript Interface类JavascriptObject标注@Keep:
@Keep
class JavascriptObject: Object() {
// ...
}
注解1:
@JavascriptInterface需要标注在Javascript调用的方法定义前。
注解2:
@SuppressLint("JavascriptInterface")需要添加在调用Webiew.addJavascriptInterface方法的方法前。