最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Router解決跨模塊下的頁面跳轉示例

 更新時間:2018年01月11日 09:37:35   作者:Android機動車  
開始模塊化開發(fā)項目之后,一個很重要的問題就是頁面見的跳轉問題,這篇文章主要介紹了Router解決跨模塊下的頁面跳轉示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、前言

開始模塊化開發(fā)項目之后,一個很重要的問題就是頁面見的跳轉問題。

關于模塊化發(fā)開,可詳見我的另一片文章 Android模塊化開發(fā)探索

正是由于將項目模塊化拆分,各模塊之間沒有任何依賴關系,也互相不可見,那么從A模塊的a界面跳轉到B模塊的b界面該怎么辦呢?

二、跨模塊跳轉的方法

這里我們會先介紹這幾種常見的跳轉方法:

  1. 顯示跳轉
  2. 隱示跳轉
  3. Scheme協(xié)議跳轉
  4. Router路由表方案

2.1 顯示跳轉

顯示跳轉即我們最最常用的跳轉方法:使用Intent,傳入當前Activity上下文,和目標Activity的class對象即可,如下:

Intent intent = new Intent();
intent.setClass(mContext, GuideActivity.class);
startActivity(intent);

顯然,這種方法只能是目標Activity可見(Activity在同一個Module下)的時候才可以這樣調用。不適合跨模塊間的跳轉。

2.2 隱示跳轉

我們這里說的隱示跳轉,intent不設置class,而是設置Action或者Category。

例如:

在清單文件中

<!--網(wǎng)頁展示界面-->
<activity
  android:name="com.whaty.base.BaseWebViewActivity"
  android:hardwareAccelerated="true">
    <intent-filter>
      <category android:name="android.intent.category.DEFAULT" />
      <action android:name="com.whaty.base.BaseWebViewActivity" />
    </intent-filter>
</activity>

跳轉時:

//創(chuàng)建一個隱式的 Intent 對象:Action 動作 
Intent intent = new Intent(); 
//設置 Intent 的動作為清單中指定的action 
intent.setAction("com.whaty.base.BaseWebViewActivity"); 
startActivity(intent);

2.3 scheme跳轉

如果我們?yōu)?B 頁面定義一個 URI - wsc://home/bbb,然后把共享的 messageModel 拍平序列化成 Json 串,那么 A 只需要拼裝一個符合 B 頁面 scheme 的跳轉協(xié)議就可以了。 wsc://home/bbb?message={ “name”:”John”, “age”:31, “city”:”New York” }

在清單文件中,配置data屬性,設置其host、path、scheme等

<activity android:name=".ui.BbbActivity"
  <intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data
      android:host="bbb"
      android:path="/home"
      android:scheme="wsc" />
  </intent-filter>
</activity>

跳轉時:

final Uri uri = new Uri.Builder().authority("wsc").path("home/bbb").appendQueryParameter("message", new Gson().toJson(messageModel)).build();
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(uri);
startActivity(intent);

以上的方法,都不是我們想要的,接下來開始介紹我們的Router方案。

三、為什么要用Router

Google提供了顯式和隱式兩種原生路由方案。但在模塊化開發(fā)中,顯式Intent存在類直接依賴的問題,造成模塊間嚴重耦合。隱式Intent則需要在Manifest中配置大量路徑,導致難以拓展(如進行跳轉攔截)。為了解決以上問題,我們需要采用一套更為靈活的Router方案。

四、實現(xiàn)思路

思路是這樣的:

使用注解,為每個目標Activity標注別名。在應用啟動時,對所有類進行掃名,將注解過的Activity存于路由表中。

跳轉時,在路由表中通過別名獲取目標Activity的class對象,使用Intent實現(xiàn)跳轉。

五、代碼實現(xiàn)

5.1 自定義注解

/**
 * Description: 路由跳轉界面 注解
 * Created by jia on 2018/1/10.
 * 人之所以能,是相信能
 */
@Target(ElementType.TYPE) //注解作用于類型(類,接口,注解,枚舉)
@Retention(RetentionPolicy.RUNTIME) //運行時保留,運行中可以處理
@Documented // 生成javadoc文件
public @interface Action {

  String DEFAULT = "js";

  String value() default DEFAULT;

}

關于自定義注解的詳細介紹,請閱讀我的文章java進階之自定義注解。這里不再多說。

5.2 注解Activity

@Action("MainActivity")
public class MainActivity extends BaseActivity implements TabLayout.OnTabSelectedListener {

  ...
}

在創(chuàng)建Activity時,用剛剛自定義的注解進行注解,為其注釋別名。

5.3 啟動時掃描

private void getAllActivities(Context ctx){
  try {
    //通過資源路徑獲得DexFile
    DexFile e = new DexFile(ctx.getPackageResourcePath());
    Enumeration entries = e.entries();
    //遍歷所有元素
    while(entries.hasMoreElements()) {
      String entryName = (String)entries.nextElement();
      //匹配Activity包名與類名
      if(entryName.contains("activity") && entryName.contains("Activity")) {
        //通過反射獲得Activity類
        Class entryClass = Class.forName(entryName);
        if(entryClass.isAnnotationPresent(Action.class)) {
          Action action = (Action)entryClass.getAnnotation(Action.class);
          this.map.put(action.value(), entryClass);
        }
      }
    }
  } catch (Exception e) {
    e.printStackTrace();
  }
}

在應用啟動時,Application中對包下的所有類進行掃描,先找到名字中到activity的(定義到activity包下),并將帶有注解標注的Activity,存入map中。

5.4 跳轉

/**
 * 頁面跳轉
 * @param activity
 * @param alias
 */
public void jumpActivity(Activity activity, String alias) throws ClassNotFoundException{
  if(map.containsKey(alias)) {
    Intent intent = new Intent(activity, map.get(alias));
    activity.startActivity(intent);
  } else {
    throw new ClassNotFoundException();
  }
}

跳轉的時候傳入目標Activity的別名即可(這里的別名就是注解的別名)。

總結

通過這種方式,解決了跳轉Activity所產(chǎn)生的的模塊依賴問題,相較于原生方案,拓展性更強。但這種方案只是階段性的,還存在一些問題。首先,加載過程中,頻繁使用到反射,會產(chǎn)生性能問題。其次,對于每個Activity的別名,需要進行統(tǒng)一維護,增加了協(xié)作成本。還有待優(yōu)化。

當然,市面上有很多流行的Router方案(如阿里的ARouter),這里只是介紹了一個思路,有好的建議歡迎交流,一起進步。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • JavaScript中數(shù)組常見操作技巧

    JavaScript中數(shù)組常見操作技巧

    下面介紹JavaScript中的數(shù)組對象遍歷、讀寫、排序等操作以及與數(shù)組相關的字符串處理操作,需要的的朋友參考下吧
    2017-09-09
  • JavaScript實現(xiàn)的CRC32函數(shù)示例

    JavaScript實現(xiàn)的CRC32函數(shù)示例

    這篇文章主要介紹了JavaScript實現(xiàn)的CRC32函數(shù),簡單介紹了CRC32函數(shù)的概念和功能,并給出實例形式分析了CRC32函數(shù)的javascript實現(xiàn)與使用方法,需要的朋友可以參考下
    2016-11-11
  • javascript 變態(tài)的節(jié)點集合

    javascript 變態(tài)的節(jié)點集合

    今天想實現(xiàn)jQuery的unwrap效果,換言之,就是用其孩子把其父節(jié)點干掉。為了效率,用到文檔碎片,而取孩子時使用到childNodes(返回一個nodeList)
    2010-03-03
  • Nautil 中使用雙向數(shù)據(jù)綁定的實現(xiàn)

    Nautil 中使用雙向數(shù)據(jù)綁定的實現(xiàn)

    這篇文章主要介紹了Nautil 中使用雙向數(shù)據(jù)綁定的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • js實現(xiàn)的格式化數(shù)字和金額功能簡單示例

    js實現(xiàn)的格式化數(shù)字和金額功能簡單示例

    這篇文章主要介紹了js實現(xiàn)的格式化數(shù)字和金額功能,結合簡單實例形式分析了javascript數(shù)字字符串轉換、運算等相關操作技巧,需要的朋友可以參考下
    2019-07-07
  • JavaScript中的數(shù)組操作介紹

    JavaScript中的數(shù)組操作介紹

    這篇文章主要介紹了JavaScript中的數(shù)組操作介紹,本文講解了join()、reverse()、sort()、concat()、slice()、splice()等幾個函數(shù)的操作實例,需要的朋友可以參考下
    2014-12-12
  • javascript 處理null及null值示例

    javascript 處理null及null值示例

    這篇文章以示例的方式為大家介紹下javascript 如何處理null及'null'值,需要的朋友可以參考下
    2014-06-06
  • JS實現(xiàn)的5級聯(lián)動Select下拉選擇框實例

    JS實現(xiàn)的5級聯(lián)動Select下拉選擇框實例

    這篇文章主要介紹了JS實現(xiàn)的5級聯(lián)動Select下拉選擇框,涉及javascript數(shù)組調用及遍歷的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • JavaScript+html5 canvas制作色彩斑斕的正方形效果

    JavaScript+html5 canvas制作色彩斑斕的正方形效果

    這篇文章主要介紹了JavaScript+html5 canvas制作色彩斑斕的正方形效果,實例分析了JavaScript結合html5 canvas實現(xiàn)圖形動態(tài)繪制的技巧,需要的朋友可以參考下
    2016-01-01
  • 微信小程序數(shù)據(jù)劫持代理的實現(xiàn)

    微信小程序數(shù)據(jù)劫持代理的實現(xiàn)

    本文主要介紹了微信小程序?數(shù)據(jù)劫持代理的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評論

阜新市| 汝阳县| 南岸区| 石楼县| 儋州市| 井冈山市| 航空| 双桥区| 凤翔县| 积石山| 闽清县| 太康县| 太保市| 桃园县| 运城市| 延安市| 怀来县| 合川市| 赤水市| 砚山县| 威信县| 凤冈县| 榆中县| 龙门县| 陆丰市| 临颍县| 涡阳县| 鸡泽县| 姚安县| 霞浦县| 滦平县| 罗源县| 达尔| 宜君县| 黎川县| 通许县| 武定县| 临颍县| 洛隆县| 秦皇岛市| 百色市|