在Android平台URI主要分五个部分:scheme, authority, path, queryParameter, queryString。其中authority又分为host和port。格式如下:(url的所有字母命名只能为小写)
scheme://host:port/path?qureyParameter=queryString
例如:myscheme://www.febmaple.com:80/mypath?key=mykey
在Android的Manifest配置文件中,在要启动的activity下配置项中有配置。
其中包含内容有:
<data android:host="" android:mimeType="" android:path="" android:pathPattern="" android:pathPrefix="" android:port="" android:scheme="" android:ssp="" android:sspPattern="" android:sspPrefix=""/>
1、web端html里写入
Click
2、android端在menifest的响应activity的intentfilter下配置,一般只需配置scheme和host即可。
3、这样手机系统自带浏览器碰到不能处理的scheme之后会发送intent给能处理的应用,因为我们的app可以处理该scheme,所以我的app得到启动。(ps:如果用webview加载html,webview碰到处理不了的scheme并不会发送intent找app处理,而系统自带浏览器是可以的,当然我们的需求就是用系统自带浏览器触发)。
Show u my code:
一、跳到app首页:新建一个app工程用webview加载所写的html,用以触发目标app。(实际需求是直接在系统浏览器里触发目标app)
1、建立html放到工程的main/assets目录下
<html>
<body>
<h1>Test Schemeh1>
<a href="myscheme://www.febmaple.com:80/mypath?key=mykey">Clicka>
body>
html>
2、webview加载本地html内容来触发目标app
wvUrl.loadUrl("file:///android_asset/test.html");
3、在app manifeset的**欢迎**activity添加intent-filter配置data标签.
<activity android:name=".ui.launching.DemoLaunchingActivity" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
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>
4、在配置好的Activity里即可获取外部跳转的参数信息。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_main_launching);
//接收网页的跳转
Intent intent = getIntent();
//Log.e("febmaple", "scheme:" +intent.getScheme());
if (intent != null) {
Uri uri = intent.getData();//获取web端传入的data数据
if (uri != null) {
Log.e("febmaple", "scheme: " + uri.getScheme());
Log.e("febmaple", "host: " + uri.getHost());
Log.e("febmaple", "port: " + uri.getPort());
Log.e("febmaple", "path: " + uri.getPath());
//Log.e("febmaple", "queryString: "+uri.getQuery());
Log.e("febmaple", "queryParameter: " + uri.getQueryParameter("key"));
}
}
}
二、如果要跳特定界面:
先根据scheme跳到欢迎界面或者主界面,然后再根据queryparameter的参数来确定跳到哪,这样避免了对每个activity都要设置intentfilter的data标签。(如果非要给多个页面配intentfilter,那直接用path作为页面区分的标志就好了)
下面是在欢迎界面获取到web端数据后再跳到特定activity的code:
1、在html中把queryparameter设为要跳的activity的名字
<a href="myscheme://www.febmaple.com:80/mypath?key=com.xxxxx.app.ui.setting.DemoActivity">Clicka>
2、在欢迎页activity里启动目标activity。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); this.setContentView(R.layout.activity_main_launching);
//接收网页的跳转
Intent intent = getIntent();
if (intent != null) {
Uri uri = intent.getData();//获取web端传入的data数据
if (uri != null) {
aimActivityName = uri.getQueryParameter("key");
Intent intent1 = new Intent();
intent1.setClassName("com.xxxx.app", aimActivityName);
startActivity(intent1);
}
}
}
终极实现方案
写一个scheme路由activity用来统一管理h5对native app的跳转
/** * 统一管理h5跳转native * 作者: FebMaple on 23/6/2017. * 邮箱: febmaple219@gmail.com * 版权: FebMaple * ==================================================== */
public class SchemeFilterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//接受网页的跳转
Intent intent = getIntent();
if (intent != null) {
Uri uri = intent.getData();//获取web端传入的data数据
if (uri != null) {
String path = uri.getPath();
if (path == null) return;
switch (path) {
case "/page1":
todo:页面跳转
finish();
break;
case "page2"://帖子详情页
todo:页面跳转
finish();
break;
default:
//nothing to do
break;
}
}
}
}
}
把路由activity设为不可见
<activity android:name=".ui.web.SchemeFilterActivity" android:launchMode="singleInstance" android:screenOrientation="portrait" android:theme="@android:style/Theme.NoDisplay">
<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:host="www.febmaple.com" android:scheme="myscheme" />
intent-filter>
activity>
注意事项,由于微信对私有协议scheme的屏蔽,导致微信分享的链接在微信的webview里是无法直接跳转native app的,所以我们采用通过先跳转浏览器中转的方式来实现。
ps:自动跳转的html:
<html>
<body>
<h1>Test Schemeh1>
<iframe src="myscheme://www.febmaple.com:80/mypath?key=mykey" style="display:none">iframe>
<a href="myscheme://www.febmaple.com:80/mypath?key=mykey">Clicka>
body>
html>