我们之前介绍了如何使用deepLink唤起app和如何使用deepLink传递参数,今天来介绍下deepLink的原理和一些坑。
deepLink的原理:
deepLink是谷歌官方支持的能力,我们的手机系统本身就支持,那么当我们使用href="test://host?type=goods&id=111"时浏览器做了什么呢,类似下面
Intent intent = new Intent();
intent.setData(Uri.parse("test://host?type=goods&id=111"));
startActivity(intent);deepLink存在的坑
上面我们可以看到浏览器内部也是通过startActivity的方式启动我们scheme对应的页面,我们都知道可以对intent设置flag,且启动其他应用时最好设置为
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);但是不同浏览器设置的tag不一致,有的也不会设置tag,会导致我们的页面activity和浏览器的处于一个task,就像我们的页面覆盖在了浏览器一样,这样体验不好
处理方式
我们可以将scheme对应的页面当成一个中间页,启动后根据获取的参数跳转至目标页并将中间页finsih掉,注意跳转时需要设置flag,这样可以跳转到我们应用的task栈
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri = getIntent().getData();
if (uri != null) {
String type = uri.getQueryParameter("type");
String id = uri.getQueryParameter("id");
if (type != null && type.equals("goods")) {
Intent intent = new Intent(getApplicationContext(), GoodsActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("id", id);
startActivity(intent);
finish();
}
}
}
0条评论