在移动开发中,经常需要从H5页面向Native APP传递参数。而Android开发中,可以通过以下几种方式实现H5传递参数给APP:
## 1. JavaScript桥接
JavaScript桥接是H5与Native APP之间传递参数的最常用方式。它通过WebView提供的addJavascriptInterface()方法注册一个Java对象来实现通信。在H5中通过JS的window.android对象来调用Java对象的方法,Java对象就可以获取到H5传递的参数。
具体实现步骤:
1. 创建一个继承自Object类的Java对象,并在该对象中定义与H5交互的方法,并注解该方法。
```java
public class JsToAndroid {
Context mContext;
public JsToAndroid(Context c) {
mContext = c;
}
@JavascriptInterface
public void showMessage(String message) {
Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();
}
}
```
2. 将该Java对象绑定到WebView上
```java
webView.addJavascriptInterface(new JsToAndroid(this), "android");
```
其中第二个参数是H5页面中访问该Java对象的名称。
3. 在H5页面中调用Java对象的方法
```html
```
这样就可以在H5页面中调用Java对象的方法,实现向APP传递参数。
## 2. URL Scheme
URL Scheme是一种将参数附加在Url中的方式。通过调用该Url可以实现启动APP并传递参数的效果。具体实现步骤如下:
1. 定义APP的Url Scheme。
```xml
```
这里我定义了一个叫做“app://”的Url Scheme。
2. 在H5页面中调用该Url Scheme,并附加参数。
```html
```
这里将两个参数id和name以键值对的形式附加在Url后面。
3. 在MainActivity的onCreate()方法中获取H5传递的参数。
```java
Intent intent = getIntent();
Uri uri = intent.getData();
if (uri != null && uri.getScheme().equals("app")) {
String id = uri.getQueryParameter("id");
String name = uri.getQueryParameter("name");
//TODO 做相应处理
}
```
这里通过调用Intent的getData()方法获取传递过来的Url,并从Url中获取id和name大家需要的参数。
## 3. Web应用程序接口(WebApp Interface)
对于一些没有太多APP功能的H5页面,可以考虑将其封装成WebApp应用,直接在浏览器中访问,无需安装APP。
具体步骤如下:
1. 在H5页面中使用JavaScript调用app运行的命令,如下所示:
```html
```
2. 在WebView的JavascriptInterface接口方法中拦截该命令,通过Reflect调用当前运行的app方法。
```java
public void invokeNativeMethod(final String call) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
Class> clazz = MainActivity.this.getClassLoader()
.loadClass("com.android.app.MainActivity");
Object instance = clazz.newInstance();
Method method = clazz.getMethod(call);
method.invoke(instance);
} catch (Exception e) {
Log.e(TAG, "Native method invoke failed.", e);
}
}
});
}
```
通过反射加载app中的类、创建实例和调用其对应方法。
总体来说,以上三种方式都能实现将H5页面中的参数传递给APP。选择何种方式要看具体的需求和场景。JavaScript桥接方式使用较多,而URL Scheme则更适用于从H5页面中打开APP的情况。如果需要在浏览器中运行,则可以考虑WebApp Interface。