Android : 混合开发整理指南

混合开发:

是一种开发模式Hybrid App.

混合开发 = Native + Web.

另一篇博文:Kotlin与H5通信

场景应用:

例如:

微信公众号通过JSSDK连接Native端和Web端

微信小程序通过内置框架连接Native端和Web端

Android : 混合开发整理指南_第1张图片


混合开发的核心技术:

JSBridge桥接器

  • 实现Native端和Web端双向通信的一种机制。
  • 以JS引擎或WebView容器作为媒介。
  • 通过约定协议进行通信

混合开发主流技术框架:

  • Web渲染: Cordova (前身是PhoneGap)
  • 原生渲染: RN、Weex、Flutter
  • 混合渲染:微信小程序

JSBridge实现原理:

Android : 混合开发整理指南_第2张图片

  • 将Native端原生接口封装为JS接口
  • 将Web端JS接口封装成原生接口
  • Web、Native端的双向通信 

案例准备:[全部源码见文末]

1.Native端UI:




    
    
    
        
        

Android : 混合开发整理指南_第3张图片

2. Web端:这里为了方便就不用公网了,node起有个服务器模拟公网

Android : 混合开发整理指南_第4张图片

Android : 混合开发整理指南_第5张图片

Android : 混合开发整理指南_第6张图片

 

Android : 混合开发整理指南_第7张图片


JSBridge的2种实现方式:[web端调用原生端有2种,原生调用web端只有1种]

1.拦截WebView请求的URL Schema

  • URL Schema是类URL的一种请求格式
  • :///?
  • 自定义JSBridge通信的URL Schema
  • jsbridge://?

Android : 混合开发整理指南_第8张图片

1.1 native 调用web端:调起了web端的弹窗

Android : 混合开发整理指南_第9张图片

package com.yinlei.hybridapp;

import androidx.appcompat.app.AppCompatActivity;

import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;

import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    private Button showBtn;
    private Button refreshBtn;
    private EditText editText;
    private MainActivity self;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        self = this;
        webView = findViewById(R.id.webView);
        refreshBtn = findViewById(R.id.refreshBtn);
        showBtn = findViewById(R.id.showBtn);
        editText = findViewById(R.id.editText);
        webView.loadUrl("http://192.168.56.1:5000/web?timestamp"+new Date().getTime());//记得加网络权限,注意网络明文适配,加时间是为了防止页面缓存
        webView.getSettings().setJavaScriptEnabled(true);
        webView.setWebChromeClient(new WebChromeClient());
        showBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String inputValue = editText.getText().toString();
                self.showWebDialog(inputValue);
            }
        });
        refreshBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {// 重新加载
                webView.loadUrl("http://192.168.56.1:5000/web?timestamp"+new Date().getTime());//记得加网络权限,注意网络明文适配,加时间是为了防止页面缓存
            }
        });

    }


    private void showWebDialog(String text){//原生端调用web端
        String jsCOde = String.format("window.showWebDialog('%s')",text);
        webView.evaluateJavascript(jsCOde,null);
    }
}

Android : 混合开发整理指南_第10张图片

1.2 web调用native端:调起了native端的弹窗

Android : 混合开发整理指南_第11张图片

Android : 混合开发整理指南_第12张图片

Android : 混合开发整理指南_第13张图片

 

 

2.向WebView注入JS API

Android : 混合开发整理指南_第14张图片

2. native 端和web端双向绑定

Android : 混合开发整理指南_第15张图片

Android : 混合开发整理指南_第16张图片

这样就把bridge对象暴露到webview中的一个名叫

NativeBridge对象上,

Android : 混合开发整理指南_第17张图片

web端可以拿到这个对象直接去调用.

Android : 混合开发整理指南_第18张图片

Android : 混合开发整理指南_第19张图片

Android : 混合开发整理指南_第20张图片

 


支持回调的JSBridge:

 上述的2种方式其实无法将执行的结果返回对方。

经常需要对端操作后需要将结果返回。

  • 在对端执行操作并返回结果
  • 有输入、输出才是完整的调用。

场景:Web端获取Native端输入框的值,还需要native端把获取的值再传回给web端。

 

Android : 混合开发整理指南_第21张图片

1. web端调用native端 

Android : 混合开发整理指南_第22张图片

Android : 混合开发整理指南_第23张图片

 改正一下上方的alert(),上面拼写错了位置

Android : 混合开发整理指南_第24张图片

 

Android : 混合开发整理指南_第25张图片 

Android : 混合开发整理指南_第26张图片

2. native端调用web端并返回结果给native端

原生端新加一个按钮:

Android : 混合开发整理指南_第27张图片

然后是一个回调:

Android : 混合开发整理指南_第28张图片

Android : 混合开发整理指南_第29张图片

Android : 混合开发整理指南_第30张图片

Android : 混合开发整理指南_第31张图片


JSBridge开源实现:

  • JSBridge: 拦截URL Schema
  • DSBridge: 注入JS API

Github上可搜索DSBridge-Android项目

本文Demo源代码见:

https://gitee.com/yinleilei/AndroidNative_Web

 

 

 

你可能感兴趣的:(Android,大前端)