中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中使用ARouter路由框架

發布時間:2021-04-13 17:13:10 來源:億速云 閱讀:533 作者:Leah 欄目:移動開發

本篇文章給大家分享的是有關如何在Android中使用ARouter路由框架,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

路由框架的特點

  1. 分發:把一個URL或者請求按照一定的規則分配給一個服務或者頁面來處理,這個流程就是分發,分發是路由框架最基本的功能,當然也可以理解成為簡單的跳轉。

  2. 管理:將組件和頁面按照一定的規則管理起來,在分發的時候提供搜索、加載、修改等操作,這部分就是管理,也是路由框架的基礎,上層功能都是建立在管理之上。

  3. 控制:就像路由器一樣,路由的過程中,會有限速、屏蔽等一些控制操作,路由框架也需要在路由的過程中,對路由操作做一些定制性的擴展,比方剛才提到的AOP,后期的功能更新,也是圍繞這個部分來做的。

ARouter的7個優勢

如何在Android中使用ARouter路由框架

優勢一:直接解析URL路由,解析參數并賦值到對應目標字段的頁面中。
優勢二:支持多模塊項目,因為現在很少有APP是單模塊的項目,一般都是多模塊單工程的,由不同的團隊負責不同的模塊開發,這時候支持多模塊項目開發就顯得尤為重要。
優勢三:支持InstantRun,目前很多路由框架并不支持InstantRun,而InstantRun是Google在AndroidStudio2.0阿爾法版本中提供的新功能,其類似于代碼的日更新,其只不過面向的是開發過程,這樣做可以在開發的過程中減少開發和編譯的次數,可以簡單地將代碼修改即時地同步到APK中,從而可以大規模降低開發復雜度。
優勢四:允許自定義攔截器,ARouter是支持攔截器的,而攔截器其實就是AOP的實現,可以自定義多個攔截器解決一些面向行為編程上出現的問題。
優勢五:ARouter可以提供IoC容器,IoC其實就是控制反轉,這一部分做過服務端開發的朋友可能比較了解,因為服務端開發經常用到的Spring框架能夠提供的一個非常重要的能力就是控制反轉。
優勢六:映射關系自動注冊,在頁面不是很多的小型APP上面,自動注冊并不會體現出太大優勢,但是對于大型APP而言,可能頁面數量已經達到的幾十個或者數百個,在這樣的情況下,自動注冊就顯得非常重要了,因為不可能將每一個頁面都通過代碼的方式進行注冊。
優勢七:靈活的降級策略,ARouter可以提供很多種降級策略供用戶自行選擇,而原生的路由方案存在無法靈活降級的問題,StartActivity()一旦失敗將會拋出運營級異常。

應用場景:

  1. 從外部URL映射到內部頁面,以及參數傳遞與解析

  2. 跨模塊頁面跳轉,模塊間解耦

  3. 攔截跳轉過程,處理登陸、埋點等邏輯

  4. 跨模塊API調用,通過控制反轉來做組件解耦

ARouter的基本使用步驟:

1、添加依賴和配置

android {
  defaultConfig {
  ...
  javaCompileOptions {
    annotationProcessorOptions {
    arguments = [ moduleName : project.getName() ]
    }
  }
  }
}

dependencies {
  // 替換成最新版本, 需要注意的是api
  // 要與compiler匹配使用,均使用最新版可以保證兼容
  compile 'com.alibaba:arouter-api:x.x.x'
  annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
  ...
}
// 替換成最新版本, 需要注意的是api
// 要與compiler匹配使用,均使用最新版可以保證兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'

這里替換相應的Api和compiler

如何在Android中使用ARouter路由框架

2、添加注解及初始化

ARouter初始化

if (isDebug()) {      // 這兩行必須寫在init之前,否則這些配置在init過程中將無效
  ARouter.openLog();   // 打印日志
  ARouter.openDebug();  // 開啟調試模式(如果在InstantRun模式下運行,必須開啟調試模式!線上版本需要關閉,否則有安全風險)
}
ARouter.init(mApplication); // 盡可能早,推薦在Application中初始化

在需要跳轉的Activity上進行注解配置

// 在支持路由的頁面上添加注解(必選)
// 這里的路徑需要注意的是至少需要有兩級,/xx/xx
@Route(path = "/com/ARouter2Activity")
public class ARouter2Activity extends AppCompatActivity {
   super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_arouter2);
  //....
}

應用中的簡單跳轉

 ARouter.getInstance().build("/com/ARouter2Activity").navigation();

應用中攜帶參數的跳轉

ARouter.getInstance().build("/com/ARouter2Activity")
            .withString("name","onex")
            .withInt("age",22)
            .navigation();

在目標Activity中接受相關的參數

為每一個參數聲明一個字段,并使用 @Autowired 標注

URL中不能傳遞Parcelable類型數據,通過ARouter api可以傳遞

Parcelable對象

@Route(path = "/com/ARouter2Activity")
public class ARouter2Activityextends Activity {
  @Autowired
  public String name;
  @Autowired
  int age;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  ARouter.getInstance().inject(this);
  // ARouter會自動對字段進行賦值,無需主動獲取
  Log.d("param", name + age + boy);
  }
}

這里需要注意的是

ARouter.getInstance().inject(this);

進階使用

1、Activity之間傳遞自定義對象

如果需要傳遞自定義對象,需要實現 SerializationService,并使用@Route注解標注(方便用戶自行選擇序列化方式)

@Route(path = "/service/json")
public class JsonServiceImpl implements SerializationService {
  @Override
  public void init(Context context) {

  }

  @Override
  public <T> T json2Object(String text, Class<T> clazz) {
    return JSON.parseObject(text, clazz);
  }

  @Override
  public String object2Json(Object instance) {
    return JSON.toJSONString(instance);
  }
}

以下是ARouter支持的傳遞的數據類型 

TestParcelable testParcelable = new TestParcelable("jack", 666);
        TestObj testObj = new TestObj("Rose", 777);
        List<TestObj> objList = new ArrayList<>();
        objList.add(testObj);

        Map<String, List<TestObj>> map = new HashMap<>();
        map.put("testMap", objList);

        ARouter.getInstance().build("/test/activity1")
            .withString("name", "老王")
            .withInt("age", 18)
            .withBoolean("boy", true)
            .withLong("high", 180)
            .withString("url", "https://a.b.c")
            .withParcelable("pac", testParcelable)
            .withObject("obj", testObj)
            .withObject("objList", objList)
            .withObject("map", map)
            .navigation();

需要注意的是:我們在傳遞的時候使用的是什么樣的KEY,在目標Activity的地方使用相同的KEY,進行聲明變量例如:

Man man = new Man("OneX","男");
ARouter.getInstance().build("/com/ARouter2Activity")
    .withObject("obj",man)
    .navigation();

目標頁面Code

 @Autowired
  Man obj;

2、通過Url進行跳轉

新建一個Activity用于監聽Schame事件,之后直接把url傳遞給ARouter即可(類似于轉發路由的Activity)

public class SchameFilterActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  Uri uri = getIntent().getData();
  ARouter.getInstance().build(uri).navigation();
  finish();
  }
}

在AndroidManifest.xml中進行如下配置

<activity android:name=".activity.SchameFilterActivity">
  <!-- Schame -->
  <intent-filter>
    <data
    android:host="m.aliyun.com"
    android:scheme="arouter"/>

    <action android:name="android.intent.action.VIEW"/>

    <category android:name="android.intent.category.DEFAULT"/>
    <category android:name="android.intent.category.BROWSABLE"/>
  </intent-filter>
</activity>

3、設置攔截器

比較經典的應用就是在跳轉過程中處理登陸事件,這樣就不需要在目標頁重復做登陸檢攔截器會在跳轉之間執行

多個攔截器會按優先級順序依次執行

@Interceptor(priority = 8, name = "測試用攔截器")
public class TestInterceptor implements IInterceptor {
  @Override
  public void process(Postcard postcard, InterceptorCallback callback) {
  ...
  callback.onContinue(postcard); // 處理完成,交還控制權
  // callback.onInterrupt(new RuntimeException("我覺得有點異常"));   // 覺得有問題,中斷路由流程

  // 以上兩種至少需要調用其中一種,否則不會繼續路由
  }

  @Override
  public void init(Context context) {
  // 攔截器的初始化,會在sdk初始化的時候調用該方法,僅會調用一次
  }
}

4、監聽路由跳轉結果

// 使用兩個參數的navigation方法,可以獲取單次跳轉的結果
ARouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() {
  @Override
  public void onFound(Postcard postcard) {
   ...
  }

  @Override
  public void onLost(Postcard postcard) {
  ...
  }
});

5、獲取Fragment的對象

// 獲取Fragment
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();

6、通過依賴注入解耦:服務管理,暴露服務

// 聲明接口,其他組件通過接口來調用服務
public interface HelloService extends IProvider {
  String sayHello(String name);
}

// 實現接口
@Route(path = "/service/hello", name = "測試服務")
public class HelloServiceImpl implements HelloService {

  @Override
  public String sayHello(String name) {
  return "hello, " + name;
  }

  @Override
  public void init(Context context) {

  }
}

在Class中的相關使用

public class Test {
  @Autowired
  HelloService helloService;

  @Autowired(name = "/service/hello")
  HelloService helloService2;

  HelloService helloService3;

  HelloService helloService4;

  public Test() {
  ARouter.getInstance().inject(this);
  }

  public void testService() {
   // 1. (推薦)使用依賴注入的方式發現服務,通過注解標注字段,即可使用,無需主動獲取
   // Autowired注解中標注name之后,將會使用byName的方式注入對應的字段,不設置name屬性,會默認使用byType的方式發現服務(當同一接口有多個實現的時候,必須使用byName的方式發現服務)
  helloService.sayHello("Vergil");
  helloService2.sayHello("Vergil");

  // 2. 使用依賴查找的方式發現服務,主動去發現服務并使用,下面兩種方式分別是byName和byType
  helloService3 = ARouter.getInstance().navigation(HelloService.class);
  helloService4 = (HelloService) ARouter.getInstance().build("/service/hello").navigation();
  helloService3.sayHello("Vergil");
  helloService4.sayHello("Vergil");
  }
}

四、注意事項及混淆配置

1、初始化中的其他配置

ARouter.openLog(); // 開啟日志
ARouter.openDebug(); // 使用InstantRun的時候,需要打開該開關,上線之后關閉,否則有安全風險
ARouter.printStackTrace(); // 打印日志的時候打印線程堆棧

2、詳細API:

// 構建標準的路由請求
ARouter.getInstance().build("/home/main").navigation();

// 構建標準的路由請求,并指定分組
ARouter.getInstance().build("/home/main", "ap").navigation();

// 構建標準的路由請求,通過Uri直接解析
Uri uri;
ARouter.getInstance().build(uri).navigation();

// 構建標準的路由請求,startActivityForResult
// navigation的第一個參數必須是Activity,第二個參數則是RequestCode
ARouter.getInstance().build("/home/main", "ap").navigation(this, 5);

// 直接傳遞Bundle
Bundle params = new Bundle();
ARouter.getInstance()
  .build("/home/main")
  .with(params)
  .navigation();

// 指定Flag
ARouter.getInstance()
  .build("/home/main")
  .withFlags();
  .navigation();

// 獲取Fragment
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();
          
// 對象傳遞
ARouter.getInstance()
  .withObject("key", new TestObj("Jack", "Rose"))
  .navigation();

// 覺得接口不夠多,可以直接拿出Bundle賦值
ARouter.getInstance()
    .build("/home/main")
    .getExtra();

// 轉場動畫(常規方式)
ARouter.getInstance()
  .build("/test/activity2")
  .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
  .navigation(this);

// 轉場動畫(API16+)
ActivityOptionsCompat compat = ActivityOptionsCompat.
  makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);

// ps. makeSceneTransitionAnimation 使用共享元素的時候,需要在navigation方法中傳入當前Activity

ARouter.getInstance()
  .build("/test/activity2")
  .withOptionsCompat(compat)
  .navigation();
    
// 使用綠色通道(跳過所有的攔截器)
ARouter.getInstance().build("/home/main").greenChannel().navigation();

// 使用自己的日志工具打印日志
ARouter.setLogger();

3、路由中的分組概念

SDK中針對所有的路徑(/test/1 /test/2)進行分組,分組只有在分組中的某一個路徑第一次被訪問的時候,該分組才會被初始化

通過 @Route 注解主動指定分組,否則使用路徑中第一段字符串(/*/)作為分組

注意:一旦主動指定分組之后,應用內路由需要使用 ARouter.getInstance().build(path, group) 進行跳轉,手動指定分組,否則無法找到

@Route(path = "/test/1", group = "app")

4、添加混淆規則(如果使用了Proguard)

-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

# 如果使用了 byType 的方式獲取 Service,需添加下面規則,保護接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

# 如果使用了 單類注入,即不定義接口實現 IProvider,需添加下面規則,保護實現
-keep class * implements com.alibaba.android.arouter.facade.template.IProvider

以上就是如何在Android中使用ARouter路由框架,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万源市| 崇州市| 云安县| 江门市| 亳州市| 潮州市| 陇川县| 方山县| 额济纳旗| 肥乡县| 沂源县| 盖州市| 牡丹江市| 衡水市| 朝阳市| 漾濞| 林周县| 桂阳县| 庐江县| 岚皋县| 南召县| 延庆县| 鹰潭市| 浪卡子县| 木兰县| 璧山县| 土默特左旗| 文水县| 冷水江市| 阿勒泰市| 横峰县| 防城港市| 二连浩特市| 潞西市| 华池县| 军事| 忻州市| 仙居县| 商都县| 白城市| 宁明县|