文章目录
  1. 1. 协议介绍
  2. 2. 实现

本文档主要介绍如何在android手机的chrome浏览器中点击一个链接,然后启动一个本地的App,并使用App中的具有浏览器功能的界面,如包信有WebView的Activity,打开一个链接。


协议介绍

这种打开方式要浏览器支持这种协议,比如chrome浏览器,然后浏览器根据协议来做指定的事情。

  • 协议格式如下所示:
1
2
3
4
5
6
7
8
9
intent:
HOST/URI-path // Optional host
#Intent;
package=[string];
action=[string];
category=[string];
component=[string];
scheme=[string];
end;
  • 参数说明:

    • HOST: 对应intent-filter标签中的data标签中的android:host属性说明;
    • scheme:对应intent-filter标签中的data标签中的android:scheme属性说明;
    • package:打开的App的包名;
    • action:接收处理这个Intent的action,可选;
    • category:接收处理Intnet的category,可选;
    • component:接收处理Intent的component,可选;

    上面这些参数对应java的代码如下所示:

1
2
3
4
5
Intent intent = new Intent("action");
intent.setData(Uri.pase("host"));
intent.addCategory("category");
intent.setComponent("component");
context.startActivity(intent);
  • 上面部分参数对应的在AndroidManifest.xml文件中的Activity中的配置如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
<activity
android:name="com.jacpy.app.ui.WebViewActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar">

<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="scheme" android:host="host" />
</intent-filter>

</activity>
  • 上面的这些说明只是说要如何利用这些参数启动这个指定的App的Activity,接下来是说明如何将一些参数信息传递给这个指定的Activity,由这个Activity来处理一些指定的操作,比如打开一个链接。

    • 传递的参数类型在java中有9种类型,分别是String(S)、Boolean(B)、Byte(b)、Character(c)、Double(d)、Float(f)、Integer(i)、Long(l)、Short(s),注意后面括号中的字母及大小写。

      比如要传一个字符串,可以写成如下所示:

      S.url=http://www.baidu.com

      键是url,值是http://www.baidu.com

      传一个int值,可以写成这样:

      i.age=30

      键是age,值是30

    • 这种传递方式对应的java代码如下所示:

1
2
intent.putExtra("url", "http://www.baidu.com");
intnet.putExtra("age", 30);
  • 注意:S.browser_fallback_url是chrome保留的内容,在手机安装了chrome 25以上版本,启动了包含有S.browser_fallback_url信息的协议,如果手机中没有安装指定包名的App那么,就会跳转到S.browser_fallback_url指定的链接,这个链接一般是放App的下载地址。在实际测试是,手机中不能安装Google Play,否则会打开google Play。而不会执行S.browser_fallback_url这个跳转。

实现

  • 按照上面的协议说明可以自定义协议,如下所示:
    intent://msp.url/#Intent;scheme=msp;package=com.jacpy.app;S.browser_fallback_url=http://www.taobao.com/app/download;S.url=http://www.baidu.com;S.title=chrome启动应用测试;end

    上面示例协议中,如果手机上没有安装包名为com.jacpy.app的应用,并且手机上没有安装google play,那么最后页面会跳转到http://wwww.taobao.com/app/download
    协议可以写在a标签中,如:

    1
    <a href=\"intent://msp.url/#Intent;scheme=msp;package=com.jacpy.app;S.browser_fallback_url=http://www.taobao.com/app/download;S.url=http://www.baidu.com;S.title=chrome启动应用测试;end\">chrome启动应用测试</a>
  • 对应的Activity配置代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jacpy.app"
android:versionCode="0"
android:versionName="2.0.0.0" >

<application
android:name="com.jacpy.app.app.App"
android:allowBackup="true"
android:icon="@drawable/logo"
android:label="@string/app_name" >

<activity
android:name="com.jacpy.app.ui.WebViewActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Black.NoTitleBar">

<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="msp" android:host="msp.url" />
</intent-filter>

</activity>
</application>
</manifest>
  • 这里要注意,如果当前应用已经启动,点击跳转链接,浏览器是不会启动相应的界面打开链接,可以对当前Activity设置android:launchMode="singleInstance"试试。
  • 协议传递数据解析处理
1
2
3
4
5
6
7
8
9
10
11
package com.jacpy.app.ui;

public class WebViewActivity extends Activity {

public void onCreate(Bundle b) {
super.onCreate(b);
Intent data = getIntent();
String url = data.getStringExtra("url"); // 要跳转的链接
String title = data.getStringExtra("title"); // 标题内容
}
}

最后,这种通过浏览器打开应用的方式只在实现了类似机制的浏览器上使用,如chrome浏览器。通过测试其他如QQ浏览器的6.6版本也支持该方式,但UC、Opera、海豚浏览器均不支持该操作。


参考:

– EOF –

文章目录
  1. 1. 协议介绍
  2. 2. 实现