WebView
的 addJavascriptInterface
方法来传递对象,从而让 JavaScript 调用 Java 的方法。
1、Android接收JS传递的对象
JavaScript端:在JavaScript中创建一个对象,并通过window.androidInterface.passObject(JSON.stringify(myObject))
将这个对象传递给Android,创建一个包含姓名和年龄的对象var myObject = {name: 'John', age: 30};
,然后将其转换为JSON字符串并传递给Android。
Android端:需要在Android的Activity中通过addJavascriptInterface
方法将一个Java对象暴露给JavaScript,以便JavaScript可以调用该Java对象的方法,创建一个名为MyJavaScriptInterface
的类,并在其中定义一个@JavascriptInterface
注解的方法passObject
,用于接收JavaScript传递的对象,然后在onCreate
方法中,将MyJavaScriptInterface
的实例传递给WebView。
完整示例:JavaScript代码如下:
<!DOCTYPE html> <html> <head> <title>Pass Object to Android</title> </head> <body> <button onclick="passObjectToAndroid()">Pass Object</button> <script> function passObjectToAndroid() { var myObject = { name: 'Alice', age: 25 }; window.androidInterface.passObject(JSON.stringify(myObject)); } </script> </body> </html>
Android代码如下:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); WebView webView = findViewById(R.id.webview); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new MyJavaScriptInterface(), "androidInterface"); webView.loadUrl("file:///android_asset/index.html"); } public class MyJavaScriptInterface { @JavascriptInterface public void passObject(String objectJson) { try { JSONObject jsonObject = new JSONObject(objectJson); String name = jsonObject.getString("name"); int age = jsonObject.getInt("age"); Log.d("MyObject", "Name: " + name + ", Age: " + age); } catch (JSONException e) { e.printStackTrace(); } } } }
2、Android向JS传递对象
Android端:在Android中创建一个对象,并将其转换为JSON格式,可以使用Gson库来轻松解析JSON,创建一个包含姓名、年龄和爱好的用户类User
,然后创建一个User
对象并使用Gson库将其转换为JSON字符串。
JavaScript端:在JavaScript中编写一个方法,用于接收并处理传递的Java对象,定义一个receiveData
方法,用于接收Android传递的对象。
完整示例:HTML代码如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>JavaScript to Android</title> </head> <body> <script> function sendObjectToAndroid() { const data = { name: 'John Doe', age: 30, hobbies: ['reading', 'traveling', 'coding'] }; const jsonData = JSON.stringify(data); Android.receiveData(jsonData); } window.onload = function() { sendObjectToAndroid(); }; </script> </body> </html>
Android代码如下:
public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); webView.loadUrl("file:///android_asset/sample.html"); } public class WebAppInterface { Context mContext; WebAppInterface(Context c) { mContext = c; } @JavascriptInterface public void receiveData(String jsonData) { Gson gson = new Gson(); User user = gson.fromJson(jsonData, User.class); Log.d("WebData", "Name: " + user.name + ", Age: " + user.age); } } }
1、如何在Android中接收JS传递的复杂对象?
答:在Android中接收JS传递的复杂对象时,通常需要将对象序列化为JSON格式的字符串进行传递,在Android端,可以使用相应的JSON解析库(如Gson或Jackson)将JSON字符串解析为Java对象,如果JS传递了一个包含多个字段和嵌套对象的复杂对象,可以在Android中使用Gson库将其解析为对应的Java类实例。
注意事项:确保在Android项目中添加了相应的JSON解析库依赖,并在解析时正确处理可能的异常情况。
2、如何确保Android与JS之间的对象传递安全?
答:为了确保Android与JS之间的对象传递安全,可以采取以下措施:
验证数据的完整性和合法性,避免接收到反面构造的数据导致应用崩溃或安全问题。
对敏感数据进行加密传输,防止数据在传递过程中被窃取或改动。
限制WebView的权限和访问范围,避免潜在的安全风险。