deeplink 的使用

在页面android 跳转中的使用,主要是处理页面的跳转

deeplink 中主要存在一下的类

DeepLinkDispatch,DeepLinkEntry,DeepLinkManager,DeepLinkUri

我们分别介绍几个类

这个几个类中,首先介绍deepLinkDispatch


    public static void startActivityDirect(Context var0, String var1, Bundle var2, int var3) {
        Intent var4 = generateIntentByUri(var0, var1, var2, var3);
        if (var4 != null) {
            if (!(var0 instanceof Activity)) {
                var4.addFlags(268435456);
            }

            var0.startActivity(var4);
            performNavigationCallback(var0, var4);
        } else {
            Log.e("DeepLinkDispatch", "cannot match uri in deeplink");
        }

    }


我们看到,在分发跳转的时候,先要 generateIntentByUri ,我们看到这个地方是组装intent 的地方,那么这个方法中的具体实现是:
 

         DeepLinkEntry var4 = DeepLinkManager.getInstance().parseUri(var1);

我们接着看这个地方是咋拼装entry 的
 

  public synchronized DeepLinkEntry parseUri(String var1) {
        if (null == this.mContext) {
            throw new NullPointerException("mContext is null, should call initDeepLinks() when application init");
        } else {
            if (this.mListEntrys == null) {
                this.mListEntrys = new ArrayList();
                this.initJsonFile("deeplinkMain.json");
            }

            if (this.mListEntrys.size() <= 0) {
                Log.e("deeplink", "deeplink did not init !");
                return null;
            } else {
                Iterator var2 = this.mListEntrys.iterator();

                DeepLinkEntry var3;
                do {
                    if (!var2.hasNext()) {
                        return null;
                    }

                    var3 = (DeepLinkEntry)var2.next();
                } while(!var3.matches(var1));

                return var3;
            }
        }
    }

我们看到这里面是 initJsonFile(),这个方法是初始化配置的

这里看到是读配置文件的

   private int initJsonFile(String var1) {
        try {
            InputStream var2 = this.mContext.getAssets().open(var1);
            if (var2 == null) {
                return -1;
            }

            ByteArrayOutputStream var3 = new ByteArrayOutputStream();
            BufferedOutputStream var4 = new BufferedOutputStream(var3);
            BufferedInputStream var5 = new BufferedInputStream(var2);
            byte[] var6 = new byte[4096];

            int var7;
            while((var7 = var5.read(var6)) != -1) {
                var4.write(var6, 0, var7);
            }

            var5.close();
            var4.flush();
            JSONArray var8 = new JSONArray(var3.toString());
            int var9 = var8.length();

            for(int var10 = 0; var10 < var9; ++var10) {
                JSONObject var11 = (JSONObject)var8.get(var10);
                int var12 = var11.optInt("type");
                String var13 = var11.optString("bundle");
                String var14 = var11.getString("uri");
                String var15 = var11.getString("activity");
                String var16 = var11.optString("method");
                DeepLinkEntry var17 = new DeepLinkEntry(var13, var14, Type.values()[var12], var15, var16);
                this.mListEntrys.add(var17);
            }
        } catch (IOException var18) {
            var18.printStackTrace();
        } catch (JSONException var19) {
            var19.printStackTrace();
        }

        return 0;
    }

主要是组装 deepLinkEntry  对象

deepLink 的实现原理本质上是调用android  

​
intent.setClassName

​

的方式去启动新的页面,如何去找到需要启动的页面,@deepLink 注解的方式,在编译的时期,编译成.json 配置文件,在启动的时候,会从.json 配置中去寻找相应的启动页面有没有在配置中

你可能感兴趣的:(开源框架)