返回

Android和H5交互之模板代码分享

Android

Android和H5交互:优化开发体验的实用模板

构建交互对象

交互对象是Android和H5交互的核心,它监听并处理来自H5端的请求。继承自WebViewClient并覆写shouldOverrideUrlLoading方法来拦截请求。

public class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        // 根据uri处理请求,如打开外部浏览器或执行Native功能
        return true;
    }
}

WebView配置交互对象

将交互对象设置到WebView,使其能处理H5请求。

WebView webView = findViewById(R.id.webView);
webView.setWebViewClient(new MyWebViewClient());

响应H5请求

在shouldOverrideUrlLoading方法中,根据uri做出不同处理,如打开外部浏览器:

Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

或执行Native功能:

// 执行Native功能代码

实现H5调用Native

使用JavaScriptInterface将Native方法暴露给H5,允许H5调用Native方法。

public class MyJavaScriptInterface {
    @JavascriptInterface
    public void callNativeMethod() {
        // 执行Native方法代码
    }
}

将JavaScriptInterface添加到WebView:

webView.addJavascriptInterface(new MyJavaScriptInterface(), "NativeInterface");

完整示例

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = findViewById(R.id.webView);
        webView.setWebViewClient(new MyWebViewClient());
        webView.addJavascriptInterface(new MyJavaScriptInterface(), "NativeInterface");
    }
    private class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            Uri uri = request.getUrl();
            if (uri.toString().startsWith("http://") || uri.toString().startsWith("https://")) {
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
                return true;
            }
            return false;
        }
    }
    private class MyJavaScriptInterface {
        @JavascriptInterface
        public void callNativeMethod() {
            // 执行Native方法代码
        }
    }
}

拓展

此模板可根据需求拓展,如处理H5参数、Native和H5数据交互以及安全机制。

常见问题解答

  • H5端如何调用Native方法? 使用JavaScriptInterface将Native方法暴露给H5。
  • Native端如何接收H5数据? 使用WebViewClient或JavaScriptInterface监听H5事件,接收数据。
  • H5端如何执行Native功能? 通过调用JavaScriptInterface中暴露的Native方法。
  • 如何确保交互安全? 采用安全机制,如CSP和验证请求。
  • 如何优化交互性能? 避免频繁WebView与H5之间的通信,使用缓存和优化数据传输。