Android和H5之间的交互

来源:互联网 发布:2017淘宝法律法规纳税 编辑:程序博客网 时间:2024/05/18 20:09
1.设置允许执⾏JS脚本:webSettings.setJavaScriptEnabled(true);
2.添加通信接⼜
webView.addJavascriptInterface(Interface,"InterfaceName")
3. JS调Android
InterfaceName.MethodName
4. Android调JS无返回值的

webView.loadUrl("javascript:functionName()");

5.Android调JS有返回值的

webView.evaluateJavascript("sum(" + a + "," + b + ")", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.e("tag", "value=" + value);
}
});


HTML中代码

[html] view plain copy
  1. <!DOCTYPE html>  
  2. <html>  
  3. <head>  
  4. <title></title>  
  5. <script type="text/javascript">  
  6.     function sum(a,b){  
  7.         return a+b;  
  8.     }  
  9.       
  10.     function s(){  
  11.         var result =window.android.back();  
  12.         document.getElementById("p").innerHTML=result;  
  13.     }  
  14.   
  15.     function sum2(a){  
  16.       document.getElementById("qq").innerHTML=a;  
  17.     }   
  18.     </script>  
  19. </head>  
  20. <body>  
  21. <button onclick="s()">js调用安卓本地方法</button>  
  22. <a href="file:///android_asset/test2.html">点击</a>  
  23. <p id="p"></p>  
  24. <p id="qq"></p>  
  25. </body>  
  26. </html>  

Android 中代码

[java] view plain copy
  1.     protected void onCreate(Bundle savedInstanceState) {  
  2.         super.onCreate(savedInstanceState);  
  3.         setContentView(R.layout.activity_main);  
  4.         mWebView = (WebView) findViewById(R.id.wb);  
  5.         findViewById(R.id.btn).setOnClickListener(new OnClickListener() {  
  6.               
  7.             @Override  
  8.             public void onClick(View v) {  
  9.                 test();  
  10.             }  
  11.         });  
  12.           
  13.   
  14.         mWebView.loadUrl("file:///android_asset/test.html");  
  15.         WebSettings webSettings = mWebView.getSettings();  
  16.         webSettings.setJavaScriptEnabled(true);  
  17.         //js调用安卓中的方法  
  18.         mWebView.addJavascriptInterface(new JsInteration(), "myandroid");  
  19.         mWebView.setWebViewClient(new WebViewClient() {  
  20.             @Override  
  21.             public boolean shouldOverrideUrlLoading(WebView view, String url) {  
  22.                 if (url.equals("file:///android_asset/test2.html")) {  
  23.                     Log.e(TAG, "shouldOverrideUrlLoading: " + url);  
  24.                     startActivity(new Intent(MainActivity.this, SecondActivity.class));  
  25.                     return true;  
  26.                 } else {  
  27.                     mWebView.loadUrl(url);  
  28.                     return false;  
  29.                 }  
  30.             }  
  31.         });  
  32.           
  33.           
  34.     }  
  35.   
  36.     public class JsInteration {  
  37.         //js调用安卓中的方法  
  38.         @JavascriptInterface  
  39.         public String testback() {  
  40.             return "hello world";  
  41.         }  
  42.     }  
  43.       
  44.   
  45.     public void test() {  
  46.         int a = 2;  
  47.         int b = 2;  
  48. // Android调用有返回值js方法  
  49.         mWebView.evaluateJavascript("sum(" + a + "," + b + ")"new ValueCallback<String>() {  
  50.             @Override  
  51.             public void onReceiveValue(String value) {  
  52.                 Log.e("tag""value=" + value);  
  53.             }  
  54.         });  
  55.   
  56.           
  57. //Android调用无返回值js方法  
  58.         mWebView.loadUrl("javascript:showDetail(" + a + ")");  
  59.           
  60.     }  
  61. }  


以下他人总结

Android和H5之间的交互

hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面

我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:

//例如:加载assets文件夹下的test.html页面mWebView.loadUrl("file:///android_asset/test.html")//例如:加载网页mWebView.loadUrl("http://www.baidu.com")

如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:

mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {                mWebView.loadUrl(url);                return true;            }        }    });
2、Android本地通过Java调用HTML页面中的JavaScript方法

想要调用js方法那么就必须让webView支持

    WebSettings webSettings = mWebView.getSettings();    //设置为可调用js方法    webSettings.setJavaScriptEnabled(true);

若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("JavaScript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:

 mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {        @Override        public void onReceiveValue(String value) {            Log.e(TAG, "onReceiveValue value=" + value);        }    });

js代码如下:

<script type="text/javascript">    function sum(a,b){    return a+b;    }    function do(){    document.getElementById("p").innerHTML="hello world";    }</script>
2、js调用Android本地Java方法

在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

 public class JsInteration {    @JavascriptInterface    public String back() {        return "hello world";    }}

定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

 mWebView.addJavascriptInterface(new JsInteration(), "android");

那么在js中怎么来调用呢?

<script type="text/javascript">     function s(){     //调用Java的back()方法    var result =window.android.back();    document.getElementById("p").innerHTML=result;    }</script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            //判断url拦截事件            if (url.equals("file:///android_asset/test2.html")) {                Log.e(TAG, "shouldOverrideUrlLoading: " + url);                startActivity(new Intent(MainActivity.this,Main2Activity.class));                return true;            } else {                mWebView.loadUrl(url);                return false;            }        }    });
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivity
public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity";private WebView mWebView;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mWebView = (WebView) findViewById(R.id.webView);    mWebView.loadUrl("file:///android_asset/test.html");    WebSettings webSettings = mWebView.getSettings();    webSettings.setJavaScriptEnabled(true);    mWebView.addJavascriptInterface(new JsInteration(), "android");    mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            if (url.equals("file:///android_asset/test2.html")) {                Log.e(TAG, "shouldOverrideUrlLoading: " + url);                startActivity(new Intent(MainActivity.this,Main2Activity.class));                return true;            } else {                mWebView.loadUrl(url);                return false;            }        }    });}//Android调用有返回值js方法@TargetApi(Build.VERSION_CODES.KITKAT)public void onClick(View v) {    mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {        @Override        public void onReceiveValue(String value) {            Log.e(TAG, "onReceiveValue value=" + value);        }    });}public class JsInteration {    @JavascriptInterface    public String back() {        return "hello world";    }}}
test.html
<!DOCTYPE html><html><head><title></title><script type="text/javascript">    function sum(a,b){    return a+b;    }     function s(){    var result =window.android.back();    document.getElementById("p").innerHTML=result;    }    </script></head><body><button onclick="s()">调用本地方法</button><a href="file:///android_asset/test2.html">点击</a><p id="p"></p></body></html>