貓眼的頁面跳轉(zhuǎn)參數(shù)解析舊方式
onCreate()中需要寫繁瑣的重復代碼
之前,我們需要在activity的onCreate()中,把頁面跳轉(zhuǎn)傳遞的參數(shù),解析出來。外界傳遞來的參數(shù)可能在intent的bundle里面,也有可能在intent的uri中(隱式跳轉(zhuǎn))。
因此為了得到跳轉(zhuǎn)的參數(shù),我們需要類似這么做:
int value = 0;
if(intent!=null){
value = intent.getIntExtra(name,defaultValue);
}
if(value == 0 && intent.getData() != null){
//從uri中獲取
Uri uri = intent.getData();
try {
intExtra = Integer.parseInt(uri.getQueryParameter(paramName));
} catch (Exception e) {
//解析錯誤,即參數(shù)不合法
//handleUnValidParam() 比如降級處理,跳轉(zhuǎn)到一個兜底頁面
}
}
解析每一個參數(shù)都要做一次上面的流程,很繁瑣。維護也有一些成本。
主參數(shù)的處理
有這么一種場景,我們一個頁面需要一個movieId作為主參數(shù),如果頁面跳轉(zhuǎn)沒有這個參數(shù),那么需要降級處理,跳轉(zhuǎn)到兜底頁面,或者主頁面。如果傳來的參數(shù)中有主參數(shù),但是沒有其他非必須參數(shù)。那么不需要降級處理,其他非必須參數(shù)給默認值就可以了,頁面正常跳轉(zhuǎn)。
這樣一種場景,之前在貓眼并沒有做。
貓眼的頁面跳轉(zhuǎn)參數(shù)解析新方式:自動注入
只需要在Activity中使用CheckAndInjectJumpParam 注解 參數(shù)對應的成員變量即可,在Activity onCreate()執(zhí)行之前,會自動把跳轉(zhuǎn)參數(shù)注入進來。不論跳轉(zhuǎn)的形式是普通顯示跳轉(zhuǎn)還是隱式跳轉(zhuǎn)。如果參數(shù)不合法,那么會自動進行降級處理:跳轉(zhuǎn)到兜底頁面;如果主參數(shù)不存在,也會進行降級處理。
public class xxxActivity{
@CheckAndInjectJumpParam(keyParam = true)
private long id;
@CheckAndInjectJumpParam
private String nm;
@CheckAndInjectJumpParam
private String enName;
@CheckAndInjectJumpParam
private boolean needRate;
protect void onCreate(Bundle bundle){
super.onCreate(bundle);
...//直接使用id、enName..
}
}
不需要在onCreate()中手寫 參數(shù)的解析,或者進行解析失敗的兜底處理工作。
大致原理
使用aop在Activity onCreate()執(zhí)行之前,進行頁面跳轉(zhuǎn)參數(shù)的解析工作。如果解析失敗/或不含有主參數(shù),那么會進行異常處理(目前是finish掉當前頁面,然后啟動兜底頁面)。注意,finish掉當前頁面時,需要調(diào)用當前頁面activty的系統(tǒng)onCreate()方法,不然會報SuperNotCalledException。
因為這些工作是在onCreate()方法執(zhí)行之前完成的,所以出現(xiàn)異常時,不會進行任何業(yè)務(wù)代碼的生命周期的回調(diào)(除onDestroy)。所以也就不會產(chǎn)生頁面含有的業(yè)務(wù)fragment等。
todo
需要繼續(xù)完成的工作是:把activity onCreate()中之前舊的參數(shù)解析方式換成新的自動注入化的跳轉(zhuǎn)參數(shù)解析方式。
具體代碼因為涉及到公司的要求,就不外放了,其實不難,使用aspectj 的Around攔截一下onCreate()就好了。阿里的Arouter做的功能更豐富一些,大家可以參考一下。