先說一下為什么想寫一個這樣的框架俘侠,Android提供了Intent機制來啟動Activity羡亩,支持顯式跳轉(zhuǎn)和隱式跳轉(zhuǎn)顾腊,這已經(jīng)是一種耦合性低的設(shè)計。但是當項目大了吴侦,跳轉(zhuǎn)的來源就會很多屋休,有原生的跳轉(zhuǎn)、有H5的跳轉(zhuǎn)备韧、有推送的跳轉(zhuǎn)等等劫樟,管理起來就會很麻煩,所以能不能統(tǒng)一這些跳轉(zhuǎn),為每個Activity配置一個URL叠艳,根據(jù)schema來判斷是要往WebView跳還是要往原生界面跳奶陈。
有時候跳轉(zhuǎn)之前還需要進行一些邏輯的判斷,比如判斷有沒有登陸附较,沒有登陸先去登陸吃粒,登陸成功之后再跳轉(zhuǎn)到著陸頁,還有一些復雜的判斷拒课,比如在需要跳轉(zhuǎn)到每個產(chǎn)品購買頁之前需要先判斷請求一下網(wǎng)絡(luò)徐勃,獲取當前用戶卡上余額,如果余額不足要先跳轉(zhuǎn)到充值頁面早像,這樣一來每個要跳轉(zhuǎn)到產(chǎn)品購買頁的地方都要去寫相同的代碼邏輯僻肖,假如能給產(chǎn)品購買頁配置一個攔截器,所有跳轉(zhuǎn)到購買頁時都先進行攔截去判斷當前用戶卡上余額卢鹦,這樣就只需要在攔截器的地方寫一次就可以了臀脏,假如這時新增了一個產(chǎn)品,只需要在該產(chǎn)品的購買頁配置上該攔截器就可以法挨,既便于維護也便于擴展谁榜。
當然目前這樣的框架已經(jīng)很多幅聘,邏輯并不是很復雜凡纳,所以自己寫了一個,能更適合目前的項目帝蒿。
@ActivityMapping
第一步荐糜,我們需要為每個Activity配置一個唯一標示URL,可以通過配置文件的方式也可以采用注解的方式葛超,記得SpringMVC里面為Controler配置URL的注解是RequestMapping暴氏,所以我自定義了一個ActivityMapping注解,通過該注解就可以為Activity配置一個唯一標示URL绣张,還可以指明該Activity需要接受哪些參數(shù)答渔。
@ActivityMapping(value = {"product/detail"}, stringParams = {"id"})
public class ProductDetailActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView t = new TextView(this);
t.setTextColor(Color.BLACK);
t.setText("product detail id = " + getIntent().getStringExtra("id"));
setContentView(t);
}
}
@ActivityInterceptor
第二步,為某些Activity配置攔截器侥涵,當然可以是多個攔截器沼撕,使用ActivityIntercetor注解,例如之后登陸用戶才能進入產(chǎn)品購買頁
@ActivityMapping(value = {"product/buy"})
@ActivityInterceptor({LoginInterceptor.class})
public class ProductBuyActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView t = new TextView(this);
t.setTextColor(Color.BLACK);
t.setText("product buy");
setContentView(t);
}
}
多個攔截器的配置芜飘,比如只有登陸并且開戶的用戶才能進入產(chǎn)品購買頁
@ActivityMapping(value = {"product/buy"})
@ActivityInterceptor({LoginInterceptor.class,CheckUserInterceptor.java})
public class ProductBuyActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView t = new TextView(this);
t.setTextColor(Color.BLACK);
t.setText("product buy");
setContentView(t);
}
}
LoginIntercetor.java
public class LoginInterceptor implements Interceptor {
boolean hasLogin;
@Override
public void doIntercept(Context context, String url, InterceptorChain interceptorChain) {
if (hasLogin) {
interceptorChain.doIntercept(context, url, interceptorChain);
} else {
interceptorChain.sendMsg(new RouterMsg(Router.MSG_FORWARD, "app://user/login"));
}
}
}
使用
build.gradle配置
apply plugin: 'android-apt'
apt{
arguments{
mainModule true
moduleName project.name
includeModules "${project.name}"
}
}
初始化路由表
public class App extends PluginApp {
@Override
public void onCreate() {
super.onCreate();
Routers.init("router");
}
}
進行跳轉(zhuǎn)
//通過url傳遞參數(shù)
Routers.getRouter(context,"schema://product/detail?id=123").open()
//通過withParam()傳遞
Routers.getRouter(context,"schema://product/detail").withParam("id","123").open()