Android和H5之间的交互

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文件所在的位置不同写法也不同:

 
  1. //例如:加载assets文件夹下的test.html页面

  2. mWebView.loadUrl("file:///android_asset/test.html")

  3. //例如:加载网页

  4. mWebView.loadUrl("http://www.baidu.com")

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

 
  1. mWebView.setWebViewClient(new WebViewClient() {

  2. @Override

  3. public boolean shouldOverrideUrlLoading(WebView view, String url) {

  4. mWebView.loadUrl(url);

  5. return true;

  6. }

  7. }

  8. });

2、Android本地通过Java调用HTML页面中的JavaScript方法

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

 
  1. WebSettings webSettings = mWebView.getSettings();

  2. //设置为可调用js方法

  3. webSettings.setJavaScriptEnabled(true);

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

 
  1. mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {

  2. @Override

  3. public void onReceiveValue(String value) {

  4. Log.e(TAG, "onReceiveValue value=" + value);

  5. }

  6. });

js代码如下:

 
  1. <script type="text/javascript">

  2. function sum(a,b){

  3. return a+b;

  4. }

  5. function do(){

  6. document.getElementById("p").innerHTML="hello world";

  7. }

  8. </script>

2、js调用Android本地Java方法

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

 
  1. public class JsInteration {

  2. @JavascriptInterface

  3. public String back() {

  4. return "hello world";

  5. }

  6. }

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

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

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

 
  1. <script type="text/javascript">

  2. function s(){

  3. //调用Java的back()方法

  4. var result =window.android.back();

  5. document.getElementById("p").innerHTML=result;

  6. }

  7.  
  8. </script>

4、拦截HTML页面中的点击事件

 
  1. mWebView.setWebViewClient(new WebViewClient() {

  2. @Override

  3. public boolean shouldOverrideUrlLoading(WebView view, String url) {

  4. //判断url拦截事件

  5. if (url.equals("file:///android_asset/test2.html")) {

  6. Log.e(TAG, "shouldOverrideUrlLoading: " + url);

  7. startActivity(new Intent(MainActivity.this,Main2Activity.class));

  8. return true;

  9. } else {

  10. mWebView.loadUrl(url);

  11. return false;

  12. }

  13. }

  14. });

以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:

mainActivity

 
  1. public class MainActivity extends AppCompatActivity {

  2. public static final String TAG = "MainActivity";

  3. private WebView mWebView;

  4.  
  5. @Override

  6. protected void onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.activity_main);

  9. mWebView = (WebView) findViewById(R.id.webView);

  10. mWebView.loadUrl("file:///android_asset/test.html");

  11. WebSettings webSettings = mWebView.getSettings();

  12. webSettings.setJavaScriptEnabled(true);

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

  14. mWebView.setWebViewClient(new WebViewClient() {

  15. @Override

  16. public boolean shouldOverrideUrlLoading(WebView view, String url) {

  17. if (url.equals("file:///android_asset/test2.html")) {

  18. Log.e(TAG, "shouldOverrideUrlLoading: " + url);

  19. startActivity(new Intent(MainActivity.this,Main2Activity.class));

  20. return true;

  21. } else {

  22. mWebView.loadUrl(url);

  23. return false;

  24. }

  25. }

  26. });

  27. }

  28. //Android调用有返回值js方法

  29. @TargetApi(Build.VERSION_CODES.KITKAT)

  30. public void onClick(View v) {

  31.  
  32. mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {

  33. @Override

  34. public void onReceiveValue(String value) {

  35. Log.e(TAG, "onReceiveValue value=" + value);

  36. }

  37. });

  38. }

  39. public class JsInteration {

  40.  
  41. @JavascriptInterface

  42. public String back() {

  43. return "hello world";

  44. }

  45. }

  46. }

test.html

 
  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. function s(){

  10. var result =window.android.back();

  11. document.getElementById("p").innerHTML=result;

  12. }

  13.  
  14. </script>

  15. </head>

  16. <body>

  17. <button onclick="s()">调用本地方法</button>

  18. <a href="file:///android_asset/test2.html">点击</a>

  19. <p id="p"></p>

  20. </body>

  21. </html>

猜你喜欢

转载自blog.csdn.net/xlwang9090/article/details/80843546