Android JS双向调用(android set data to html)

本文介绍如何在Android应用中实现WebView组件与JavaScript之间的双向通信。通过实例演示了如何从Java调用JavaScript方法并传递JSON数据,以及如何从JavaScript端触发Java方法。
Android手机中内置了一款高性能webkit内核,该内核完美封装到了WebView组件中,而从js中直接调用java方法和在java中直接调用js方法更是让我们看到了WebView的强大,下面这个小例子介绍了怎样在js和java中双向调用方法 

1.首先是布局文件main.xml 
Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical"  
  4.     android:layout_width="fill_parent"  
  5.     android:layout_height="fill_parent"  
  6.     >  
  7. <WebView  
  8.     android:layout_width="fill_parent"  
  9.     android:layout_height="fill_parent"  
  10.     android:id="@+id/webView"  
  11.     />  
  12. </LinearLayout>  


2.在assets目录下新建一个index.html文件 
Html代码   收藏代码
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  
  2.         "http://www.w3.org/TR/html4/loose.dtd">  
  3. <html>  
  4. <head>  
  5.   <title></title>  
  6.     <script type="text/javascript">  
  7.         //data数据类型为字符串,字符串里面是数组,每一个数组元素为一个json对象,例如"[{id:1,name:'张三',phone:'135656461'},{id:2,name:'李四',phone:'1896561'}]"  
  8.         function setContactInfo(data)  
  9.         {  
  10.             var tableObj = document.getElementById("contact");  
  11.             var jsonObjects = eval(data);   //通过eval方法处理得到json对象数组  
  12.             for(var i=0; i<jsonObjects.length; i++)  
  13.             {  
  14.                    var jsonObj = jsonObjects[i];    //获取json对象  
  15.                    var tr = tableObj.insertRow(tableObj.rows.length);   //添加一行  
  16.                    //添加三列  
  17.                    var td1 = tr.insertCell(0);  
  18.                    var td2 = tr.insertCell(1);  
  19.                    var td3 = tr.insertCell(2);  
  20.                      
  21.                    td1.innerHTML = jsonObj.id;  
  22.                    td2.innerHTML = jsonObj.name;  
  23.                    td3.innerHTML = jsonObj.phone;  
  24.             }  
  25.         }  
  26.   
  27.     </script>  
  28. </head>  
  29. <!--onload="javascript:myObject.init()调用服务器端init方法-->  
  30. <body onload="javascript:myObject.init()">  
  31.       <table id="contact">  
  32.           <tr>  
  33.               <td>编号</td>  
  34.               <td>姓名</td>  
  35.               <td>电话</td>  
  36.           </tr>  
  37.       </table>  
  38. </body>  
  39. </html>  


3.接着是Activity 
Java代码   收藏代码
  1. package com.lamp.activity;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.webkit.WebView;  
  7.   
  8. public class HTMLActivity extends Activity {  
  9.     private WebView webView = null;  
  10.     public Handler handler = new Handler();  
  11.     @Override  
  12.     public void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.           
  16.         webView = (WebView)this.findViewById(R.id.webView);  
  17.         //设置字符集编码  
  18.         webView.getSettings().setDefaultTextEncodingName("UTF-8");  
  19.         //开启JavaScript支持  
  20.         webView.getSettings().setJavaScriptEnabled(true);  
  21.         webView.addJavascriptInterface(new MyObject(this,handler), "myObject");  
  22.         //加载assets目录下的文件  
  23.         String url = "file:///android_asset/index.html";  
  24.         webView.loadUrl(url);  
  25.     }  
  26. }  


4.然后是绑定js的类MyObject 
Java代码   收藏代码
  1. package com.lamp.activity;  
  2.   
  3. import org.json.JSONArray;  
  4. import org.json.JSONException;  
  5. import org.json.JSONObject;  
  6.   
  7. import android.os.Handler;  
  8. import android.webkit.WebView;  
  9.   
  10. public class MyObject {  
  11.     private Handler handler = null;  
  12.     private WebView webView = null;  
  13.   
  14.     public MyObject(HTMLActivity htmlActivity, Handler handler) {  
  15.         this.webView = (WebView)htmlActivity.findViewById(R.id.webView);  
  16.         this.handler = handler;  
  17.     }  
  18.       
  19.     public void init(){  
  20.         //通过handler来确保init方法的执行在主线程中  
  21.         handler.post(new Runnable() {  
  22.               
  23.             public void run() {  
  24.                 //调用客户端setContactInfo方法  
  25.                 webView.loadUrl("javascript:setContactInfo('" + getJsonStr() + "')");  
  26.             }  
  27.         });  
  28.     }  
  29.       
  30.     public static String getJsonStr(){  
  31.         try {  
  32.             JSONObject object1 = new JSONObject();  
  33.             object1.put("id"1);  
  34.             object1.put("name""张三");  
  35.             object1.put("phone""123456");  
  36.               
  37.             JSONObject object2 = new JSONObject();  
  38.             object2.put("id"2);  
  39.             object2.put("name""李四");  
  40.             object2.put("phone""456789");  
  41.               
  42.             JSONArray jsonArray = new JSONArray();  
  43.             jsonArray.put(object1);  
  44.             jsonArray.put(object2);  
  45.             return jsonArray.toString();  
  46.         } catch (JSONException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.         return null;  
  50.     }  
  51. }  


运行项目,我们可以看到两位联系人的信息显示在了屏幕上









<think>嗯,用户问的是Android Studio能否实现前端后端联动。首先,我需要确认用户对“前端后端联动”的理解。可能他们指的是在Android应用中,前端(即用户界面)和后端(服务器或本地数据处理)之间的交互。 接下来,我要回忆Android Studio的功能。Android Studio主要用于开发Android应用的前端部分,也就是客户端。但用户可能想知道是否可以用它来同时处理后端开发。这时候需要区分,后端通常指的是服务器端,可能需要用其他语言如Java、Kotlin(使用Ktor)、Python(Django/Flask)或者Node.js等来实现。不过,用户可能想了解在Android应用中如何与后端服务进行通信,或者是否可以在Android Studio中集成后端开发。 然后,考虑到用户之前的问题是关于全新开发没有Python代码库,所以可能他们希望使用原生Android技术栈,不需要依赖外部语言。这时候应该强调Android Studio本身可以处理客户端开发,并通过网络请求与后端服务通信,但后端部分需要单独开发,不过可以使用Kotlin配合Ktor框架在同一个项目中管理,但实际部署可能需要服务器环境。 另外,用户可能对前后端联动的具体实现方式感兴趣,比如RESTful API、WebSocket等。需要给出具体的技术方案,如Retrofit用于网络请求,Room数据库用于本地存储,以及如何通过ViewModel和LiveData管理数据流。 还要考虑用户可能的误区,比如是否能在Android Studio里直接写后端代码。需要澄清Android Studio主要是客户端开发工具,后端通常需要其他工具,但可以配合使用。同时,提供示例代码和配置,帮助用户理解如何实现联动。 最后,总结关键点,确保用户明白前后端联动的实现方式,并推荐合适的学习路径和工具,帮助他们在实际开发中应用这些技术。</think>━━━━━━━━━━━━━━━━━━ Android 前后端联动实现指南 ━━━━━━━━━━━━━━━━━━ **完全可行**!Android Studio 原生支持前后端交互开发,以下是具体实现方案与技术选型建议: ▌联动架构原理 ```mermaid graph LR A[Android 前端] -->|HTTP/WebSocket| B(后端服务器) B -->|JSON/Protobuf| C[(数据库)] B -->|API 响应| A ``` ▌核心实现方案(原生技术栈) **1. 前端实现(Android Studio)** - **网络请求层**:使用 Retrofit + Kotlin 协程 ```kotlin // 定义API接口 interface UserService { @GET("users/{id}") suspend fun getUser(@Path("id") userId: String): Response<User> } // 使用示例 val retrofit = Retrofit.Builder() .baseUrl("https://api.yourserver.com/") .addConverterFactory(GsonConverterFactory.create()) .build() val service = retrofit.create(UserService::class.java) viewModelScope.launch { try { val user = service.getUser("123") _userData.value = user.body() } catch (e: IOException) { // 处理网络异常 } } ``` - **数据绑定层**:ViewModel + LiveData/Flow ```kotlin class UserViewModel : ViewModel() { private val _userData = MutableLiveData<User>() val userData: LiveData<User> = _userData fun loadData(userId: String) { viewModelScope.launch { // 调用Repository层 } } } ``` **2. 后端实现方案选型** | 技术类型 | 推荐方案 | 联动特点 | |----------------|-------------------------|----------------------------| | **纯Kotlin** | Ktor框架 | 共享业务逻辑代码 | | **Java系** | Spring Boot | 企业级功能完善 | | **轻量级** | Node.js + Express | 快速原型开发 | | **云端集成** | Firebase Cloud Functions| 免服务器管理 | **3. 本地联动特例**: 对于不需要远程服务器的场景,可通过 Room 数据库实现本地持久化: ```kotlin @Dao interface UserDao { @Query("SELECT * FROM users") fun getAll(): Flow<List<User>> @Insert suspend fun insert(user: User) } // 使用示例 val db = Room.databaseBuilder( context, AppDatabase::class.java, "database-name" ).build() ``` ▌联调关键技巧 1. **接口模拟**:使用 Postman 或 MockWebServer 预先调试API ```kotlin // 单元测试中的模拟服务器 val mockWebServer = MockWebServer() mockWebServer.enqueue(MockResponse().setBody("{'name':'test'}")) mockWebServer.start() ``` 2. **数据验证**:在 Android 端添加网络状态监测 ```xml <!-- AndroidManifest.xml 添加权限 --> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ``` 3. **安全加固**: - 使用 HTTPS 加密通信 - 添加 OkHttp 拦截器实现统一鉴权 ```kotlin val client = OkHttpClient.Builder() .addInterceptor { chain -> val request = chain.request().newBuilder() .addHeader("Authorization", "Bearer $token") .build() chain.proceed(request) } .build() ``` ▌典型应用场景 1. **实时数据同步**:WebSocket 长连接 ```kotlin val webSocket = OkHttpClient().newWebSocket( Request.Builder().url("ws://yourserver.com/ws").build(), object : WebSocketListener() { override fun onMessage(webSocket: WebSocket, text: String) { // 处理实时消息 } } ) ``` 2. **文件传输**:Multipart 表单上传 ```kotlin val requestBody = MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", "avatar.jpg", File("path/to/file").asRequestBody("image/jpeg".toMediaType())) .build() ``` ━━━━━━━━━━━━━━━━━━ 调试工具推荐 ━━━━━━━━━━━━━━━━━━ - **Charles Proxy**:监控网络请求与响应 - **Android Profiler**:分析网络流量与内存使用 - **Chrome DevTools**:调试 WebView 内容 - **Logcat 过滤**:使用 `adb logcat -s Retrofit` 查看网络日志 ━━━━━━━━━━━━━━━━━━ 学习路线建议 ━━━━━━━━━━━━━━━━━━ 1. 掌握 RESTful API 设计规范 2. 熟练使用 JSON 序列化(Gson/Moshi) 3. 学习 OAuth2.0 认证流程 4. 实践 WebSocket 双向通信 5. 了解 gRPC 协议优化传输效率 **关键公式**: 对于典型请求响应模型,可用以下公式估算性能: $$ T_{total} = T_{network} + T_{parse} + T_{process} $$ 其中: - $T_{network}$ ≈ RTT(往返时间) × 请求次数 - $T_{parse}$ 与数据复杂度成正比 - $T_{process}$ 取决于业务逻辑复杂度 通过优化网络请求批处理(如 GraphQL)和选择高效数据格式(Protobuf),可显著提升联动效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值