`

js调用android

 
阅读更多

先说为什么需要讨论这个问题。

 

现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个是功能通用,不仅android可以用,ios也可以用,symbian也可以直接用。

 

那为什么现在很多手机应用并不做成web方式的呢?原因很多。一个是现阶段web方式展现能力相对较弱,如果对于应用的美观程度要求比较高,就无法使用web方式;一个是web方式速度相对较慢,用户体验会受一些影响;一个是现阶段流量还是相对宝贵,web方式流量相对较大;还有一个就是有一些功能无法使用web方式实现(关于这一点,现在又很多开源的项目可以实现手机的一些硬件功能,比如拍照啊,获取通讯录啊,都是可以的,感兴趣的可以搜索一下phoneGap。但是从现有的反馈来看,速度较慢,体验较差)。

 

基于以上的原因,现在很多项目会把一部分功能做成web方式的,一部分功能用其它控件来写。这就需要web页面与其它控件做一些交互。如何交互呢,就是利用自定义的javascript。

 

下面虚拟一个场景。

 

现在有一个功能,展现当前用户的好友列表,好友列表页是web方式的,点击某好友的头像以后,进入该好友的详情页面,而这个页面呢,由于某些原因,没做成web方式的。

 

假设好友列表页是UserListActivity,包含一个webview。好友详情页面是UserDetailActivity,包含很多控件和业务逻辑。

 

我们以id来唯一标示用户。好友列表页中,点击每一个好友头像,都会调用:

onclick="javascript:android.user('1')"

类似这样的js语句。因本文主要介绍android,而不是web开发内容,所以具体不再详述,熟悉web开发的同学很容易理解。

 

我们现在需要做的,就是显示用户列表页面,然后在用户点击头像以后,响应具体的js请求,跳到该好友详细页面。

 

下面看看大概的实现方法。

 

默认情况下,在WebView中是不能使用javascript的。可以通过下面的代码:

[java] view plain copy
 
 print?
  1. WebView myWebView = (WebView) findViewById(R.id.webview);  
  2.   
  3. WebSettings webSettings = myWebView.getSettings();  
  4.   
  5. webSettings.setJavaScriptEnabled(true);  


 

使javascript功能可用。这部分代码都放在UserListActivity中的onCreate()方法里。

 

然后是注册JS接口。先看看webview的一个方法。

 

public void addJavascriptInterface (Object obj, String interfaceName)

Since: API Level 1

Use this function to bind an object to JavaScript so that the methods can be accessed from JavaScript.

IMPORTANT:

·         Using addJavascriptInterface() allows JavaScript to control your application. This can be a very useful feature or a dangerous security issue. When the HTML in the WebView is untrustworthy (for example, part or all of the HTML is provided by some person or process), then an attacker could inject HTML that will execute your code and possibly any code of the attacker's choosing.
Do not use addJavascriptInterface() unless all of the HTML in this WebView was written by you.

·         The Java object that is bound runs in another thread and not in the thread that it was constructed in.

Parameters

obj

The class instance to bind to JavaScript, null instances are ignored.

interfaceName

The name to used to expose the instance in JavaScript.

 

我们在UserListActivity类的onCreate()方法中增加如下语句:

mWebView.addJavascriptInterface(this, "android");

在UserListActivity类中增加如下方法:

public void user(String id) {

        // 获取id,跳转activity。

    }

 

这样当页面调用onclick="javascript:android.user('1')"语句的时候,就可以映射到UserListActivity对象的user()方法了。

这里user方法有一个参数,是要对应js语句的user(‘1’)。

 

下面附上所有代码。

 

Android部分的代码:

 

[java] view plain copy
 
 print?
  1. package com.arui.framework.android.js;  
  2.   
  3.    
  4.   
  5. import android.app.Activity;  
  6.   
  7. import android.content.Intent;  
  8.   
  9. import android.os.Bundle;  
  10.   
  11. import android.view.View;  
  12.   
  13. import android.webkit.WebSettings;  
  14.   
  15. import android.webkit.WebView;  
  16.   
  17.    
  18.   
  19. import com.arui.framework.R;  
  20.   
  21. import com.arui.framework.android.js.UserDetailActivity;  
  22.   
  23.    
  24.   
  25. public class UserListActivity extends Activity {  
  26.   
  27.    
  28.   
  29.     private WebView mWebView;  
  30.   
  31.       
  32.   
  33.     @Override  
  34.   
  35.     public void onCreate(Bundle savedInstanceState) {  
  36.   
  37.    
  38.   
  39.         super.onCreate(savedInstanceState);  
  40.   
  41.          
  42.   
  43.        setContentView(R.id.userlist);  
  44.   
  45.          
  46.   
  47.        mWebView = (WebView) findViewById(R.id.mywebview);  
  48.   
  49.        WebSettings webSetting = mWebView.getSettings();  
  50.   
  51.        //设置js可用  
  52.   
  53.        webSetting.setJavaScriptEnabled(true);  
  54.   
  55.        // 添加js调用接口  
  56.   
  57.        mWebView.addJavascriptInterface(this"android");   
  58.   
  59.        //载入具体的web地址  
  60.   
  61.        mWebView.loadUrl("http://blog.csdn.net/arui319");  
  62.   
  63.        mWebView.setVisibility(View.VISIBLE);  
  64.   
  65.        mWebView.requestFocus();  
  66.   
  67.     }  
  68.   
  69.       
  70.   
  71.     public void user(String id) {   
  72.   
  73.        //跳转activity  
  74.   
  75.        Intent intent = new Intent(this, UserDetailActivity.class);  
  76.   
  77.        intent.putExtra("id", id);  
  78.   
  79.        startActivity(intent);  
  80.   
  81.     }   
  82.   
  83. }  


 

资源文件:

[html] view plain copy
 
 print?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <LinearLayout   
  4.   
  5.     xmlns:android="http://schemas.android.com/apk/res/android"  
  6.   
  7.     android:orientation="vertical"  
  8.   
  9.     android:layout_width="fill_parent"  
  10.   
  11.     android:layout_height="fill_parent" >  
  12.   
  13.     <WebView  
  14.   
  15.        android:id="@+id/mywebview"  
  16.   
  17.        android:layout_width="fill_parent"  
  18.   
  19.        android:layout_height="fill_parent"   
  20.   
  21.        android:visibility="gone"/>  
  22.   
  23. </LinearLayout>  


 

Web页面的局部代码:

<img src="……" onclick="javascript:android.user('1')" />

 

分享到:
评论

相关推荐

    JS调用Android方法,向Android方法传递json数据

    本文将深入探讨如何使用JavaScript调用Android的方法,并传递JSON数据,以实现两者之间的高效通信。 首先,我们需要了解`Android WebView`。WebView是Android系统提供的一种组件,它能够加载并显示网页内容,就像是...

    JS调用Android代码实现

    本文将深入探讨如何通过JS调用Android代码,实现两者之间的通信,以达到增强网页应用功能的目的。 首先,我们要理解的是,JS与Android的交互主要依赖于WebView组件。WebView 是Android提供的一种用于加载和显示网页...

    JS调用Android Native API

    总结来说,JS调用Android Native API是通过Webview组件和`addJavascriptInterface`方法实现的,它使得开发者能够利用JavaScript的便利性和Android的原生功能,构建出功能丰富的混合应用。这种方式不仅简化了开发流程...

    android和js相互调用

    ### JavaScript调用Android 要使JavaScript能够调用Android方法,你需要实现`WebViewClient`并重写`shouldOverrideUrlLoading()`方法。在这个方法中,你可以识别特定的URL模式并执行相应的Android代码。比如,定义...

    js调用android本地方法的实现

    JS调用Android本地方法能够利用Web技术的灵活性和原生功能的强大性,为用户提供更好的体验。本篇文章将详细介绍如何在JS通过WebView调用Android的本地方法,同时规避`addJavascriptInterface`的安全问题。 首先,...

    uniapp js调用Android代码.zip

    《uniapp中JavaScript调用Android原生代码的实践与详解》 在移动应用开发领域,uniapp因其跨平台特性及高效的开发效率,受到广大开发者喜爱。然而,有时我们需要利用JavaScript与Android原生代码进行交互,以实现...

    android webview中使用Java调用JavaScript方法并获取返回值

    如果需要在WebView中启用JavaScript调用Android代码的功能,还要在addJavascriptInterface()方法中声明一个Java类的实例,并为其指定一个可以在JavaScript中访问的接口名字。 在Java代码中定义一个内部类,用于接收...

    android、js互相调用

    **二、JavaScript调用Android** 1. **注入JavaScript接口**: 通过`addJavascriptInterface()`暴露的Java对象,JavaScript可以直接调用其方法。例如,我们在Java中定义了一个名为`callAndroid()`的方法,JavaScript...

    PhoneGap js调用 android demo

    这个“PhoneGap js调用 android demo”是PhoneGap技术的一个实例,展示了如何通过JavaScript来调用Android平台的原生功能。 首先,我们需要理解PhoneGap的核心原理。PhoneGap提供了一个桥接机制,通过JavaScript...

    android通过js调用安卓系统功能.zip

    要实现JavaScript调用Android系统功能,我们需要做以下几步: 1. **创建JavaScript Interface**: 在Android代码中,创建一个实现了`java.lang.reflect.InvocationHandler`接口的类,并使用`@JavascriptInterface`...

    JS调用Android

    **JS调用Android** 在移动应用开发中,JavaScript与Android之间的交互是一个常见需求,尤其是在混合应用开发中。这种交互能够使网页应用充分利用原生平台的能力,提供更好的用户体验。本示例提供了一个完整的代码集...

    使用Webview中的JavaScript调用Android方法

    下面将详细解释如何在WebView中实现JavaScript调用Android方法。 首先,为了使JavaScript能够与Android进行交互,我们需要启用WebView的JavaScript支持。这可以通过`WebSettings`类来实现。`WebSettings`提供了丰富...

    android webveiew js调用

    其次,要实现JavaScript调用Android方法,我们需要使用`WebView`的`addJavascriptInterface()`方法。这个方法允许我们将一个Java对象暴露给JavaScript环境。例如,我们创建一个名为`MyJavaScriptInterface`的类,并...

    Android调用JavaScript_android源码.zip

    Android调用JavaScript以及JavaScript调用Android是Android应用开发中的重要技能,它允许我们充分利用WebView的能力,实现更丰富的交互体验。理解其工作原理和源码机制,有助于我们更好地优化性能和提升安全性。

    android通过js调用安卓系统功能_Android源码.zip

    在Android开发中,有时我们需要在Webview中嵌入JavaScript代码,并允许这些JavaScript代码与原生Android应用进行交互,实现调用Android系统功能。这通常涉及到一个技术领域叫做“JavaScript Interface”,它使得...

    Android应用源码之android通过js调用安卓系统功能.zip

    在Android应用开发中,有时我们需要实现网页(HTML)与原生Android系统功能的交互,例如通过JavaScript调用Android系统的一些特定功能。这个压缩包“Android应用源码之android通过js调用安卓系统功能.zip”提供了...

    android webview js 调用接口拍照效果

    而将JavaScript(JS)与Webview结合使用,可以实现更丰富的交互功能,比如在H5页面中调用Android原生功能,如拍照。这个“android webview js 调用接口拍照效果”主题就是关于如何通过JavaScript接口来调用Android的...

    Android与JS相互调用

    二、JS调用Android 1. **`postMessage()`和`WebChromeClient`**:JavaScript可以通过`window.postMessage`发送消息到Android,然后在Android端通过实现`WebChromeClient`的`onJsMessage()`方法来接收这些消息。 `...

    android之webview与js相互调用

    JavaScript调用Android代码则需要实现`WebViewClient`的`shouldOverrideUrlLoading()`方法,并通过`addJavascriptInterface()`添加一个Java对象到Webview,使得JavaScript可以访问这个对象的方法。 首先,创建一个...

    android js 互相调用

    android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用 android js 互相调用

Global site tag (gtag.js) - Google Analytics