使用ARouter實(shí)現(xiàn)登錄攔截功能

引入

一個(gè)應(yīng)用中有許多頁面沟沙,有些頁面是需要登錄才能看的河劝,當(dāng)我們進(jìn)行頁面跳轉(zhuǎn)時(shí)會(huì)先判斷用戶是否登錄,如果已經(jīng)登錄矛紫,則正常跳轉(zhuǎn)赎瞎,如果沒有登錄,則跳轉(zhuǎn)到登錄頁面先登錄颊咬,但凡是有注冊务甥,登錄的APP,這樣的操作喳篇,大家應(yīng)該都很熟悉吧敞临。一般情況下,我們的邏輯是這樣的:

if (TextUtils.isEmpty(HeaderUtils.getSessionId())) {//還沒登錄麸澜,先跳轉(zhuǎn)登錄頁面
     Intent intent = new Intent(this, LoginActivity.class);
     startActivity(intent);
 } else {//已經(jīng)登錄了挺尿,跳轉(zhuǎn)訂單頁面
      Intent intent = new Intent(this, OrderActivity.class);
      startActivity(intent);
 }

上面的做法需要在每一個(gè)目標(biāo)頁面重復(fù)做登陸檢查,這樣設(shè)計(jì)的擴(kuò)展性并不友好。在這里介紹阿里的ARouter路由框架票髓,可以更加優(yōu)雅的實(shí)現(xiàn)登錄攔截功能。

ARoute功能介紹

  1. 支持直接解析標(biāo)準(zhǔn)URL進(jìn)行跳轉(zhuǎn)铣耘,并自動(dòng)注入?yún)?shù)到目標(biāo)頁面中
  2. 支持多模塊工程使用
  3. 支持添加多個(gè)攔截器洽沟,自定義攔截順序
  4. 支持依賴注入,可單獨(dú)作為依賴注入框架使用
  5. 支持InstantRun
  6. 支持MultiDex(Google方案)
  7. 映射關(guān)系按組分類蜗细、多級管理裆操,按需初始化
  8. 支持用戶指定全局降級與局部降級策略
  9. 頁面、攔截器炉媒、服務(wù)等組件均自動(dòng)注冊到框架
  10. 支持多種方式配置轉(zhuǎn)場動(dòng)畫
  11. 支持獲取Fragment
  12. 完全支持Kotlin以及混編()
  13. 支持第三方 App 加固(使用 arouter-register 實(shí)現(xiàn)自動(dòng)注冊)
  14. 支持生成路由文檔

使用方法

1.gradle配置

android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
}
?
dependencies {
      ...
      implementation 'com.alibaba:arouter-api:1.4.0'
      annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
}

2.Application初始化sdk

 if (BuildConfig.DEBUG) {
    // 這兩行必須寫在init之前踪区,否則這些配置在init過程中將無效
    ARouter.openLog(); // 打印日志
    ARouter.openDebug();// 開啟調(diào)試模式(如果在InstantRun模式下運(yùn)行,必須開啟調(diào)試模式吊骤!線上版本需要關(guān)閉,否則有安全風(fēng)險(xiǎn))}
 }
 ARouter.init(this);// 盡可能早缎岗,推薦在Application中初始化

3.添加注解

public class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //在baseActivity自動(dòng)注入屬性
        ARouter.getInstance().inject(this);
    }
}
//對應(yīng)的Activity 添加@Route注解 path路徑 這里的路徑需要注意的是至少需要有兩級,/xx/xx
@Route(path = RoutePath.FIRST_PATH)
public class FirstActivity extends BaseActivity {

    @Autowired
    public String msg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        ((TextView)findViewById(R.id.tv_msg)).setText(msg);
    }
}

4.攔截器的使用面向切面編程

// 在跳轉(zhuǎn)過程中處理登陸事件白粉,這樣就不需要在目標(biāo)頁重復(fù)做登陸檢查
// 攔截器會(huì)在跳轉(zhuǎn)之間執(zhí)行传泊,多個(gè)攔截器會(huì)按優(yōu)先級順序依次執(zhí)行  
@Interceptor(name = "login", priority = 6)
public class LoginInterceptorImpl implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        String path = postcard.getPath();
        LogUtils.e(path);
        boolean isLogin = SPUtils.getInstance().getBoolean(RoutePath.SP_IS_LOGIN, false);

        if (isLogin) { // 如果已經(jīng)登錄不攔截
            callback.onContinue(postcard);
        } else {  // 如果沒有登錄
            switch (path) {
                // 不需要登錄的直接進(jìn)入這個(gè)頁面
                case RoutePath.LOGIN_PATH:
                case RoutePath.FIRST_PATH:
                    callback.onContinue(postcard);
                    break;
                // 需要登錄的直接攔截下來
                default:
                    callback.onInterrupt(null);
                    break;
            }
        }

    }

    @Override
    public void init(Context context) {//此方法只會(huì)走一次
        LogUtils.e("路由登錄攔截器初始化成功");
    }
}
//啟動(dòng)Activity
ARouter.getInstance().build(RoutePath.SECOND_PATH)
                        .withString("msg", "ARouter傳遞過來的需要登錄的參數(shù)msg")
                        .navigation(this,new LoginNavigationCallbackImpl());//第二個(gè)參數(shù)是路由跳轉(zhuǎn)的回調(diào)
public class LoginNavigationCallbackImpl  implements NavigationCallback {
    @Override //找到了
    public void onFound(Postcard postcard) {

    }

    @Override //找不到了
    public void onLost(Postcard postcard) {

    }

    @Override    //跳轉(zhuǎn)成功了
    public void onArrival(Postcard postcard) {

    }

    @Override
    public void onInterrupt(Postcard postcard) {
        String path = postcard.getPath();
        LogUtils.v(path);
        Bundle bundle = postcard.getExtras();
        // 被登錄攔截了下來了 
        // 需要調(diào)轉(zhuǎn)到登錄頁面,把參數(shù)跟被登錄攔截下來的路徑傳遞給登錄頁面鸭巴,登錄成功后再進(jìn)行跳轉(zhuǎn)被攔截的頁面
        ARouter.getInstance().build(RoutePath.LOGIN_PATH)
                .with(bundle)
                .withString(RoutePath.PATH, path)
                .navigation();
    }
}

效果圖

圖片發(fā)自簡書App

項(xiàng)目地址:https://github.com/belong571/ARouteLogin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末眷细,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鹃祖,更是在濱河造成了極大的恐慌溪椎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恬口,死亡現(xiàn)場離奇詭異校读,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祖能,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門地熄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芯杀,你說我怎么就攤上這事端考。” “怎么了揭厚?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵却特,是天一觀的道長。 經(jīng)常有香客問我筛圆,道長裂明,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任太援,我火速辦了婚禮闽晦,結(jié)果婚禮上扳碍,老公的妹妹穿的比我還像新娘。我一直安慰自己仙蛉,他們只是感情好笋敞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著荠瘪,像睡著了一般夯巷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哀墓,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天趁餐,我揣著相機(jī)與錄音,去河邊找鬼篮绰。 笑死后雷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吠各。 我是一名探鬼主播喷面,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼走孽!你這毒婦竟也來了惧辈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤磕瓷,失蹤者是張志新(化名)和其女友劉穎盒齿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體困食,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡边翁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了硕盹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片符匾。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瘩例,靈堂內(nèi)的尸體忽然破棺而出啊胶,到底是詐尸還是另有隱情,我是刑警寧澤垛贤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布焰坪,位于F島的核電站,受9級特大地震影響聘惦,放射性物質(zhì)發(fā)生泄漏某饰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黔漂。 院中可真熱鬧诫尽,春花似錦、人聲如沸炬守。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳较。三九已至驹止,卻和暖如春浩聋,著一層夾襖步出監(jiān)牢的瞬間观蜗,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工衣洁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墓捻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓坊夫,卻偏偏與公主長得像砖第,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子环凿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345