欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > > 内容正文

Android 使用Scheme实现从网页启动APP,androidscheme,第一种方式使用Schem

来源: 开发者 投稿于  被查看 30767 次 评论:165

Android 使用Scheme实现从网页启动APP,androidscheme,第一种方式使用Schem


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

这样就可以了


用户评论