Coin163

首页 > 【Android】Webview使用自定义的javascript进行回调 - 博客频道 - CSDN.NET

【Android】Webview使用自定义的javascript进行回调 - 博客频道 - CSDN.NET

相关标签: webview android javascript

2021腾讯云限时秒杀,爆款1核2G云服务器298元/3年!(领取2860元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1062

2021阿里云最低价产品入口+领取代金券(老用户3折起),
入口地址https://www.aliyun.com/minisite/goods

相关推荐:android fragment中带有listview,自定义item - 博客频道 - CSDN.NET

前几天碰到一个问题,做到tab切换fragment,而fragment中带有listView。 看了几篇其他博主的文章,大致上说采用listfragment,单纯的fragment不能用自定义item的listview。 一开始我是相信的,采用了listfragment。但是写完了listFragment才发现这个listfragm

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

 

现在很多的手机应用,都可能会直接嵌入一个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的。可以通过下面的代码:

  1. WebView myWebView = (WebView) findViewById(R.id.webview);  
  2.   
  3. WebSettings webSettings = myWebView.getSettings();  
  4.   
  5. webSettings.setJavaScriptEnabled(true);  


 

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

 

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

 

相关推荐:Android自定义数据库异步操作 - 博客频道 - CSDN.NET

平时我们在开发Android应用的时候,数据库操作是无法避免的,之前开发过程中,一直没太去在意在主线程中操作数据库,毕竟一般的数据库操作都在毫秒级的,但是考虑到极限的情况下,万一数据库要插入上万条数据呢,这样就会卡死主线程,导致应用使用不流畅,用

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部分的代码:

 

  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. }  


 

资源文件:

  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')" />

原文

先说为什么需要讨论这个问题。   现在很多的手机应用,都可能会直接嵌入一个web页面。这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端;另一个

------分隔线----------------------------