Android 使用AgentWeb加载h5页面,并互调方法

build.gradle(Moudle.app)androidx的引用

1
implementation 'com.just.agentweb:agentweb-androidx:4.1.4'

布局的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    //标题
    <include
        layout="@layout/activity_left_title_text_view"/>

    <LinearLayout
        android:id="@+id/view"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

kotlin实现案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import android.net.http.SslError
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import android.view.ViewGroup
import android.webkit.SslErrorHandler
import android.webkit.WebView
import com.jeremyliao.liveeventbus.LiveEventBus
import com.just.agentweb.AgentWeb
import com.just.agentweb.WebChromeClient
import kotlinx.android.synthetic.main.activity_left_title_text_view.*
import kotlinx.android.synthetic.main.activity_my_web_view.*
import org.jetbrains.anko.toast

/**
 *@Created by wrs on 2020/9/25,11:43
 *@Description: h5页面加载
 */
class MyWebActivity : BaseActivity(),View.OnClickListener,JsInterfaceListener {

    var mAgentWeb:AgentWeb? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_my_web_view)
        initView()
        initData()
        initListener()
    }

    override fun initView() {
        tvTitle.text = ""
    }

    private val webChromeClient = object : WebChromeClient(){

        override fun onReceivedTitle(view: WebView?, title: String?) {
            super.onReceivedTitle(view, title)
            tvTitle.text = title
        }

    }

    private fun getWebViewClient(): com.just.agentweb.WebViewClient {
        return object : com.just.agentweb.WebViewClient() {
            override fun onReceivedSslError(
                view: WebView?,
                handler: SslErrorHandler,
                error: SslError?
            ) {
                handler.proceed()
            }
        }
    }


    override fun initData() {
        //访问h5的路径
        val pathUrl = intent.getStringExtra(MyParms.PARAMS)

        mAgentWeb = AgentWeb.with(this)
            .setAgentWebParent(view, ViewGroup.LayoutParams(-1, -1))
            .useDefaultIndicator()
            .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
            .setWebChromeClient(webChromeClient)
            .setWebViewClient(getWebViewClient())
            .createAgentWeb()
            .ready()
            .go(pathUrl)
        val webSetting = mAgentWeb?.webCreator?.webView?.settings
        webSetting?.javaScriptEnabled = true
        //此处为agentweb声明js方法
        mAgentWeb?.jsInterfaceHolder?.addJavaObject("android",AndroidInterface(this))
    }

    override fun initListener() {
        ivBack.setOnClickListener(this)
    }

    override fun jsPullUpMethod(method: String, parmas: String) {
        when(method){
            "toMain" ->{//js调用android的方法
                toast("js调用android的方法")
            }
        }
    }

    override fun onClick(v: View?) {
        when(v?.id){
            R.id.ivBack ->{//返回
                if (mAgentWeb?.back() == true){//返回上一层
                }else{//关闭当前webview界面
                    finish()
                }
            }
        }
    }

    override fun onPause() {
        mAgentWeb?.webLifeCycle?.onPause()
        super.onPause()
    }

    override fun onResume() {
        mAgentWeb?.webLifeCycle?.onResume()
        super.onResume()
    }

    override fun onDestroy() {
        mAgentWeb?.webLifeCycle?.onDestroy()
        super.onDestroy()
    }

    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return if (mAgentWeb?.let { it.handleKeyEvent(keyCode, event) } == true) {
            true
        } else super.onKeyDown(keyCode, event)
    }


}

AndroidInterface类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import android.webkit.JavascriptInterface;

/**
 *  
 *
 * @Created by wrs on 2020/10/16,13:57
 * @Description: js条用android的方法
 */
public class AndroidInterface extends Object {

    private JsInterfaceListener jsInterface;

    public AndroidInterface(JsInterfaceListener jsInterface) {
        this.jsInterface = jsInterface;
    }

    @JavascriptInterface
    public void jsCallMethod(String method,String params){
        jsInterface.jsPullUpMethod(method,params);
    }

}

js调android的监听方法

1
2
3
4
5
6
7
8
9
10
11
package com.dsy.jxih.iml

/**
 *@Created by wrs on 2020/10/16,14:00
 *@Description: js调用android的方法配合AndroidInterface
 */
interface JsInterfaceListener {

    fun jsPullUpMethod(method:String,params:String)

}