Android 使用Scheme实现从网页启动APP

在工作中用到了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;
      }

这样就可以了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值