Android 路由框架

先說一下為什么想寫一個這樣的框架俘侠,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()

github地址:https://github.com/imishx/ActivityRouter.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末务豺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗦明,更是在濱河造成了極大的恐慌笼沥,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異奔浅,居然都是意外死亡馆纳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門乘凸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厕诡,“玉大人,你說我怎么就攤上這事营勤×橄樱” “怎么了?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵葛作,是天一觀的道長寿羞。 經(jīng)常有香客問我,道長赂蠢,這世上最難降的妖魔是什么绪穆? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮虱岂,結(jié)果婚禮上玖院,老公的妹妹穿的比我還像新娘。我一直安慰自己第岖,他們只是感情好难菌,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蔑滓,像睡著了一般郊酒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上键袱,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天燎窘,我揣著相機與錄音,去河邊找鬼蹄咖。 笑死褐健,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的澜汤。 我是一名探鬼主播蚜迅,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼银亲!你這毒婦竟也來了慢叨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤务蝠,失蹤者是張志新(化名)和其女友劉穎拍谐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡轩拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年践瓷,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亡蓉。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡晕翠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出砍濒,到底是詐尸還是另有隱情淋肾,我是刑警寧澤,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布爸邢,位于F島的核電站樊卓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏杠河。R本人自食惡果不足惜碌尔,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望券敌。 院中可真熱鬧唾戚,春花似錦、人聲如沸待诅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咱士。三九已至立由,卻和暖如春轧钓,著一層夾襖步出監(jiān)牢的瞬間序厉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工毕箍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弛房,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓而柑,卻偏偏與公主長得像文捶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子媒咳,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,264評論 25 707
  • Android路由框架Router 什么是路由粹排?說簡單點就是映射頁面跳轉(zhuǎn)關(guān)系的,當然它也包含跳轉(zhuǎn)相關(guān)的一切功能涩澡。 ...
    FullStack閱讀 32,919評論 37 131
  • 在項目的開發(fā)過程中顽耳,我們可能會遇到一些很重的App,涉及到很多業(yè)務(wù)線,N個團隊的共同開發(fā)射富。這個時候膝迎,如果還是單ap...
    小魚愛記錄閱讀 1,350評論 1 10
  • 什么是Rabbits? Rabbits是用于Android項目的路由組件胰耗。具有統(tǒng)一管理路由限次、支持動態(tài)更新等方便的特...
    kyleduo閱讀 1,125評論 0 16
  • 暑假畫的好像.... 那個時候沒有拍詳細教程 就是對著S君的圖畫的... 現(xiàn)在手機里面沒有原圖... 也好沒有對比...
    白色花開夢里花落閱讀 627評論 0 2