之前没怎么涉及到Wap端跳转打开App的操作。因为项目有需求就顺便记录下。 一开始我们都是常规的scheme_name配置,然后wap简单的弄个<ahref="scheme_name://www.heyclock.me/test?id=12587">gogog</a>
这种方式相对比较简单,但是也有很多问题。 像微信、qq、某些渣渣浏览器可能会过滤掉这些scheme,不支持这种方式。 可能需要跟某些渣渣合作吧。。。fuck....
看配置 - 在某个页面,一般是SplashActivity页面下面包含这个过滤器:
<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="fucksb" />
</intent-filter>
当然Wap端通过fucksb这个scheme唤起时,你就可以启动并且接收一些参数 - 比如从头今日头条进入淘宝的某个商品页面(我们的隐私都被泄漏了,你看京东,淘宝等,基本上头条已经把你的浏览信息获取到了。可恶的某些购物app,非得把你的信息留存,然后提供给第三方app,然后给自己增加流量,同时给第三方带来广告收益),可恶呀!
当启动页面时就可以获取一些scheme后面附带的参数了。 至于想获取啥,看你们规定传的参数信息了....
String scheme = intent.getScheme();
Uri uri = intent.getData();
System.out.println("scheme:"+scheme);
if (uri != null) {
String host = uri.getHost();
String dataString = intent.getDataString();
String id = uri.getQueryParameter("id");
String path = uri.getPath();
String path1 = uri.getEncodedPath();
String queryString = uri.getQuery();
System.out.println("host:"+host);
System.out.println("dataString:"+dataString);
System.out.println("id:"+id);
System.out.println("path:"+path);
System.out.println("path1:"+path1);
System.out.println("queryString:"+queryString);
}
到此简单的启动和参数基本没什么了。 试了五款手机浏览器,基本三款可以支持。 qq,微信貌似不行呀。。 So,我们要解决。好吧,懒得和tecent啥的打交道。。。直接第三方LinkedME。。。。
LinkedME,企业级深度链接(Deep Linking)服务平台 打波广告,记得给我vip呀,终身免费呀。哈哈。。。。
直接给个集成文档就行 Android SDK · LinkedME文档中心
1. 前面一些步骤,没什么说的,自己照着整就行
2.其中:
2.1 若应用需要向前兼容到Android 4.0以下版本,请在基类(如:BaseActivity)中添加如下代码以便管理Session - 这个地方不管了,4.0就算了。
2.2 添加深度链接(DeepLink)跳转逻辑
其实它的思路是这样的:A> 配置了scheme的页面作为唤醒启动页面,这个和常规普通做法一样,只是多了很多linkme自定义的一些参数,加密什么的。。
B> 然后启动页面后,比如启动的是SplashActivity页面,然后进入HomeActivity页面,由于我们在HomeActvity页面配置了如下,所以当进入主页后就会开启跳转功能 - 跳转到MiddleActvity页面进行逻辑处理和跳转
在App首页(也称主页,例如:MainActivity)的onResume()方法中调用LinkedME.getInstance().setImmediate(true)方法,开启跳转功能。示例如下:
@Override
protected void onResume() {
super.onResume();
LinkedME.getInstance().setImmediate(true);
}
而MiddleActivity我们是配置在Application里面的
//设置处理跳转逻辑的中转页,MiddleActivity详见后续配置
LinkedME.getInstance().setHandleActivity(MiddleActivity.class.getName());
所以自然而然这个linkme就可以记录这些信息,然后进行相应的自己处理。
总结一下两种方式:
1. Splash(配置了linkme的scheme)->Home->Middle->xxx页面;
2. Splash(配置了linkme的scheme)->Home->null
一个是继续跳转到指定页面, 一个是单纯的启动而已....看需求自己弄咯....
其实了,官方文档是这样的:有一个单独的UriSchemeProcessActivity页面,这个页面用来配置scheme,也就是作为跳转启动页,类似splash页面。 通过这个页面做类似推送消息从通知栏跳转到置顶页面的功能,对啊,就是Splash了呀。
所以,如果你有了相关的处理,你就直接配置到Splash下面就可以了。没必要再搞一个这个启动页面啥的。。。
而这个里面的官方处理是唤起App自身,然后关闭当前页面。其实都可以啦。。看你自己怎么弄了。 反正了解了它的逻辑流程就行,别的自己修改就好。
嗮下我的中间处理页面:
package com.xxxxx.app.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.xxxxxx.app.bean.AppChildPageChangeBean;
import com.xxxxxxxxx.app.bean.AppPageChangeBean;
import com.microquation.linkedme.android.LinkedME;
import com.microquation.linkedme.android.util.LinkProperties;
import org.greenrobot.eventbus.EventBus;
import java.util.HashMap;
public class MiddleActivity extends AppCompatActivity {
// ...
/**
* 解析深度链获取跳转参数,开发者自己实现参数相对应的页面内容
* 通过LinkProperties对象调用getControlParams方法获取自定义参数的HashMap对象,
* 通过创建的自定义key获取相应的值,用于数据处理。
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getIntent() != null) {
//获取与深度链接相关的值
LinkProperties linkProperties = getIntent().getParcelableExtra(LinkedME.LM_LINKPROPERTIES);
if (linkProperties != null) {
Log.e("LinkedME-Demo", "Channel " + linkProperties.getChannel());
Log.e("LinkedME-Demo", "control params " + linkProperties.getControlParams());
Log.e("LinkedME-Demo", "link(深度链接) " + linkProperties.getLMLink());
Log.e("LinkedME-Demo", "是否为新安装 " + linkProperties.isLMNewUser());
//获取自定义参数封装成的hashmap对象,参数键值对由集成方定义
HashMap<String, String> hashMap = linkProperties.getControlParams();
//根据key获取传入的参数的值,该key关键字View可为任意值,由集成方规定,请与web端商议,一致即可
String type = hashMap.get("type");
if (type != null) {
//根据不同的参数进行页面跳转,detail代表具体跳转到哪个页面,此处语义指详情页
if (type.contains("archives")) {
//DetailActivity类不存在,此处语义指要跳转的详情页,参数也是由上面的HashMap对象指定
Intent intent = new Intent(MiddleActivity.this, InfoNewsDetailActivity.class);
intent.putExtra("id", Integer.parseInt(hashMap.get("id")));
intent.putExtra("html", "");
startActivity(intent);
}else if (type.contains("news")) {
///< 切换到资讯页面
EventBus.getDefault().post(new AppPageChangeBean(AppChildPageChangeBean.INFO_FLASH_PAGE, ""));
}else if (type.contains("activity")) {
Intent intent = new Intent(MiddleActivity.this, ActivityDetailActivity.class);
intent.putExtra("id",Integer.parseInt(hashMap.get("id")));
intent.putExtra("from", "hezuo");
startActivity(intent);
}
}
}
}
finish();
}
// ...
}
因为wap端有很多类型的详情都可以跳转到置顶页面,所以我做了一些处理。你也是根据项目需求来就行。。。
记得主页里面配置LinkedME.getInstance().setImmediate(true); 如果不想进行跳转就行LinkedME.getInstance().setImmediate(false); 这样就可以单纯的做启动....
项目做多了,接触多了,要补的知识就越来越少了 - It's me ....
补充一下,关于启动页过滤器的配置 - 官方有两种方式,你可能会疑惑到底都配置还是选一种:只需要修改sheme和pathPrefix即可,别的不用动。文档也说了...
<activity
android:name=".activity.SplashActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--Wap打开App 采用LinkedME-->
<!--<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="xxxxx" />-->
<!--</intent-filter>-->
<intent-filter>
<!-- 此处scheme值需要替换为后台设置中的scheme值 -->
<!-- host禁止更改!!! -->
<!-- 禁止配置其他属性 -->
<data
android:host="linkedme"
android:scheme="xxxxx" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
<!-- APP Links方式,Android 23版本及以后支持 -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- 以下pathPrefix值需要替换为后台设置中 App ID 的值-->
<!-- host中设置的lkme.cc不要更改!!!-->
<data
android:host="lkme.cc"
android:pathPrefix="/appid"
android:scheme="https" />
<data
android:host="lkme.cc"
android:pathPrefix="/appid"
android:scheme="http" />
</intent-filter>
</activity>
网友评论