越来越多的App采用了Native + H5方式开发,其中Native与H5页面如何交互?google提供了一个公共的方式:js与native互调,即js可以调用Native方法,Native同样也可以调用js方法;
但是这种交互方式存在着不少问题:
1、Java 调用 js 里面的函数、效率并不是很高、估计要200ms左右吧、做交互性很强的事情、这种速度很难让人接受、而js去调Java的方法、速度很快、50ms左右、所以尽量用js调用Java方法
2、Java 调用 js 的函数、没有返回值、调用了就控制不到了
3、Js 调用 Java 的方法、返回值如果是字符串、你会发现这个字符串是 native 的、转成 locale 的才能正常使用、使用 toLocaleString() 函数就可以了、不过这个函数的速度并不快、转化的字符串如果很多、将会很耗费时间
4、网页中尽量不要使用jQuery、执行起来需要5-6秒、最好使用原生的js写业务脚本、以提升加载速度、改善用户体验
5、android4.2以下的系统存在着webview的js对象注入漏洞…(不清楚的可以google)
基于这种种的原因,我们并未采用这种方式用于Native与webview交互,而是采用scheme + cookie的方式;
本文主要介绍scheme的简单使用以及注意事项;
(一)简单使用
1)在androidmanifest.xml中定义scheme
<!-- scheme协议 -->
<activity android:name=".UI.translate.NativeAppActivity" android:label="@string/app_name">
<!-- 要想在别的App上能成功调起App,必须添加intent过滤器 -->
<intent-filter>
<!-- 协议部分,随便设置 -->
<data android:scheme="uumobile" />
<!-- 下面这几行也必须得设置 -->
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<action android:name="android.intent.action.VIEW" />
</intent-filter>
</activity>
这样我们便定义了能够接受scheme请求的activity实例,当网页或者是android代码发送这种规则scheme的请求的时候就能够吊起NativeAppActivity了。
2)当然就是实现NativeAppActivity
/** * Created by admin */
public class NativeAppActivity extends Activity {
public String tag = "NativeAppActivity";
public Activity mContext = null;
public void onCreate(Bundle b)
{
super.onCreate(b);
mContext = this;
Uri uri = getIntent().getData();
if (uri != null)
{
List<String> pathSegments = uri.getPathSegments();
String uriQuery = uri.getQuery();
Intent intent;
if (pathSegments != null && pathSegments.size() > 0) {
// 解析SCHEME
if (someif) {
dosomething();
}
else {
// 若解析不到SCHEME,则关闭NativeAppActivity;
finish();
}
} else {
finish();
}
} else {
finish();
}
}
}
NativeAppActivity这个类中主要用于实现对scheme的解析,然后做出相应的动作,比如请求scheme跳转登录页面,我们可以这样定义
uumobile://appname/gotoLogin
然后我们解析出scheme如果是这样的结构就跳转登录页面。。。
这里简单说一下,我们可以通过Intent对象获取调用的scheme的host等信息
this.getIntent().getScheme();//获得Scheme名称
this.getIntent().getDataString();//获得Uri全部路径
3)调用scheme
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("uumobile://yongche/123123123")));
需要注意的是我们要实现自己的权限机制,比如跳转某一页面时,需要判断是否有这种权限跳转。
android中的scheme是一种非常好的实现机制,通过定义自己的scheme协议,可以非常方便跳转app中的各个页面;
通过这种机制可以在网页或者是通过初始化代码打开自己app的某一个页面;