在工作中用到了H5界面调用native的activity,当时想到了两种方法,第一种方式是通过scheme的方式实现,第二种方式是通过拦截webview的url让后进行重定向的方式来实现,下面就讲解一下具体是怎样实现的,希望可以帮助需要的同学。
第一种方式使用Scheme方式调起native的activity
通过使用Scheme,可以实现用手机的浏览器(内置或第三方)访问一个网页,启动自己的应用,或者在一个应用使用WebView.loadUrl()方法启动另外一个应用
实现原理:
对Android平台而言,URI主要分为四部分 scheme, authority,path, queryString。其中authority又分为host和port。格式如下:
scheme://host:port/path?qureyParameter=queryString
举个例子:
http://www.orangecpp.com:80/tucao?id=hello
在Android的Manifest配置文件中,配置项中有配置,其中包含内容有:
<data android:host=""
android:mimeType=""
android:path=""
android:pathPattern=""
android:pathPrefix=""
android:port=""
android:scheme=""
android:ssp=""
android:sspPattern=""
android:sspPrefix=""/>
通过配置可以对网页进行过滤,符合匹配条件的网页才跳转到应用。一般只需要设置host和scheme即可。
实现步骤
下面介绍一下具体的实现步骤
1、在工程的asset下面建立test.html
<html>
<body>
<h1>Test Scheme</h1>
<!--手动点击跳转-->
<a href="myscheme://www.test.com:80/mypath?key=mykey">Click</a>
</body>
</html>
2、创建一个Android测试工程,修改Manifest文件,给想要接收跳转的Activity添加配置
<activity android:name=".SecondActivity">
<!--需要添加下面的intent-filter配置-->
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="myscheme" />
</intent-filter>
</activity>
3、在配置好的Activity里即可获取外部跳转的参数信息。
WebView webView = (WebView) getActivity().findViewById(R.id.webview);
webView.loadUrl("file:///android_asset/h/test.html");
这样就可以调起native的activity了。
第二种方式通过webView拦截重新定向调起activity
整个过程是在webView中实现的
1、覆写webView的 boolean shouldOverrideUrlLoading(WebView view, String url)方法
2、在这个方法中进行具体的操作
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
DebugLog.i(TAG, "shouldOverrideUrlLoading = " + url);
Uri uriData = Uri.parse(url); //将拦截的url转换成uri
String scheme = uriData.getScheme();// 获得uri的scheme
if (“商定的scheme”.equals(scheme)) { // 如果这个scheme是native和H5之前商定的就跳转
// 跳转到制定的activity中
} else { // 如果不是继续在H5中执行
view.loadUrl(url);
}
}catch (Exception e){
e.printStackTrace();
}
return true;
}
这样就可以了