App都是由大量的頁面構成,部分頁面用戶能夠以遊客身份進行瀏覽,可是還有部分頁面大都須要用戶登陸後才能夠瀏覽。這時候就須要判斷當前用戶是否登陸,若是用戶未登陸,則須要先登陸;若是用戶已經登陸,則能夠直接跳轉。相似實現方式以下:bash
if(LoginUtils.getInstance().isLogin()){
startActivity(new Intent(context,DetailActivity.class));
}else{
startActivity(new Intent(context,LoginActivity.class));
}
複製代碼
可是若是一個App有大量的頁面進入的先行條件都是用戶已經登陸,這樣就容易形成大量的代碼冗餘,不易後期維護,咱們能夠經過AOP實現方式來處理。因爲項目中使用了ARouter路由框架,能夠經過其攔截器來處理這個問題。框架
攔截器ide
@Interceptor(priority = 8, name = "login")
public class LoginInterceptorImpl implements IInterceptor {
@Override
public void process(Postcard postcard, InterceptorCallback callback) {
String path = postcard.getPath();
LogUtils.d(path);
boolean isLogin = SPUtils.getInstance().getBoolean(Constant.SP_IS_LOGIN, false);
if(isLogin){
callback.onContinue(postcard);
}else{
switch (path){
// 須要登陸的直接進入這個頁面
case PageRouter.TEST_A:
case PageRouter.TEST_B:
callback.onInterrupt(null);
break;
// 不須要登陸的直接攔截下來
default:
callback.onContinue(postcard);
break;
}
}
}
@Override
public void init(Context context) {
}
}
複製代碼
跳轉post
public class LoginNavigationCallbackImpl implements NavigationCallback {
@Override
public void onFound(Postcard postcard) {
}
@Override
public void onLost(Postcard postcard) {
}
@Override
public void onArrival(Postcard postcard) {
}
@Override
public void onInterrupt(Postcard postcard) {
String path = postcard.getPath();
Bundle bundle = postcard.getExtras();
ARouter.getInstance().build(PageRouter.MINE_LOGIN)
.with(bundle)
.withString("path", path)
.navigation();
}
}
複製代碼