AgentWeb安卓化H5网页框架心得第一章js和java互调篇

新手一边做一边学,我也初次用这个,做个笔记

这东西相当于你自己的一个浏览器。比webview好处更多,比如原生下载功能,读写cookie和缓存,下拉刷新,JS和JAVA互相调用,事件处理,全屏视频播放等等功能,当然其它可以别出心裁地自行添加。

一个新事物,最关心的就是怎么简单使用了。

开源地址

https://github.com/Justson/AgentWeb

基础调用

private AgentWeb mAgentWeb; //本系统webview
private Activity mActivity;
private LinearLayout mLinearLayout;
mActivity=this;

mAgentWeb = AgentWeb.with(mActivity)
.setAgentWebParent(mLinearLayout, new LinearLayout.LayoutParams(-1, -1))
.useDefaultIndicator()
.setWebChromeClient(mWebChromeClient)
.setWebViewClient(mWebViewClient)
.setMainFrameErrorView(R.layout.agentweb_error_page, -1)
.setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
.setWebLayout(new WebLayout(mActivity))
.setOpenOtherPageWays(DefaultWebClient.OpenOtherPageWays.ASK)//打开其他应用时,弹窗咨询用户是否前往其他应用
.interceptUnkownUrl() //拦截找不到相关页面的Scheme
.createAgentWeb()
.ready()
.go("file:///android_asset/loadpage/loading.html");

切换网页可以这样

mAgentWeb.getUrlLoader().loadUrl("http://www.baidu.com");

jst和java互调,官方说的简单

java调用js很简单

<script>
function callByAndroid(){
console.log("callByAndroid")
}
</script>
mAgentWeb.getJsAccessEntrace().quickCallJs("callByAndroid");

js调用android就复杂一点点

首先

mAgentWeb.getJsInterfaceHolder().addJavaObject("android",new AndroidInterface(mAgentWeb,this));
//其中android可以改成其它字符
在js中调用类似这样
window.android.callAndroid();

在common有一个示例文件AndroidInterface.java里面有一个callAndroid()例 子

在此AndroidInterface.java文件里面加如下代码,网页js调用读取imei例 子

    @JavascriptInterface
    public String getimei() {
        System.out.println("来自js用java:getimei");
        return getIMEIDeviceId(context.getApplicationContext());
    }
    public static String getIMEIDeviceId(Context context) {

        String deviceId;
        //if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
        if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P || BuildCompat.isAtLeastQ())
        {
            deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
        } else {
            final TelephonyManager mTelephony = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (context.checkSelfPermission(Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                    return "";
                }
            }
            assert mTelephony != null;
            if (mTelephony.getDeviceId() != null)
            {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                {
                    deviceId = mTelephony.getImei();
                }else {
                    deviceId = mTelephony.getDeviceId();
                }
            } else {
                deviceId = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
            }
        }
        Log.d("deviceId", deviceId);
        return deviceId;
    }

然后网页端JS调用如下

<script>
if(window.android!=null && typeof(window.android)!="undefined"){
alert(window.android.getimei());
}
</script>

如此你看明白了吗? 不懂的可以交流。