我们之前介绍了如何使用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();
            }
        }
    }