引言
App都是由大量的頁面構成,部分頁面用戶可以以遊客身份進行瀏覽,但是還有部分頁面大都需要用戶登錄後纔可以瀏覽。這時候就需要判斷當前用戶是否登錄,如果用戶未登錄,則需要先登錄;如果用戶已經登錄,則可以直接跳轉。類似實現方式如下:
if(LoginUtils.getInstance().isLogin()){
startActivity(new Intent(context,DetailActivity.class));
}else{
startActivity(new Intent(context,LoginActivity.class));
}
複製代碼
但是如果一個App有大量的頁面進入的先行條件都是用戶已經登錄,這樣就容易造成大量的代碼冗餘,不易後期維護,我們可以通過AOP實現方式來處理。由於項目中使用了ARouter路由框架,可以通過其攔截器來處理這個問題。
通過ARouter IInterceptor實現登錄攔截
攔截器
@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) {
}
}
複製代碼
跳轉
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();
}
}
最後
如果你看到了這裏,覺得文章寫得不錯就給個讚唄!歡迎大家評論討論!如果你覺得那裏值得改進的,請給我留言。一定會認真查詢,修正不足,定期免費分享技術乾貨。喜歡的小夥伴可以關注一下哦。謝謝!