在页面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 配置中去寻找相应的启动页面有没有在配置中