Android路由框架-ARouter詳解(非原創)

文章大綱

1、頁面路由基本介紹
1.什麼是頁面路由
2.爲何要使用頁面路由
2、頁面路由框架ARouter介紹
1.經常使用功能介紹
2.常見應用場景
3、源碼下載
4、參考文章javascript

 

1、頁面路由基本介紹

1.什麼是頁面路由

  映射頁面跳轉關係,包含跳轉相關的URL跳轉及值傳遞、攔截器等功能。css

2.爲何要使用頁面路由

  在原始android開發中,當咱們須要進行頁面跳轉時,正常寫法以下:html

Intent intent = new Intent(mContext, XXActivity.class); intent.putExtra("key","value"); startActivity(intent); Intent intent = new Intent(mContext, XXActivity.class); intent.putExtra("key","value"); startActivityForResult(intent, 100); 

上述寫法容易出現如下問題:java

  1. 多人協同開發的時候,你們都去AndroidManifest.xml中定義各類IntentFilter,使用隱式Intent,最終發現AndroidManifest.xml中充斥着各類Schame,各類Path,須要常常解決Path重疊覆蓋、過多的Activity被導出,引起安全風險等問題
  2. 跳轉過程當中沒法插手:直接經過Intent的方式跳轉,跳轉過程開發者沒法干預,一些面向切面的事情難以實施,比方說登陸、埋點這種很是通用的邏輯,在每一個子頁面中判斷又很不合理,畢竟activity已經實例化了
  3. 跨模塊沒法顯式依賴:在App小有規模的時候,咱們會對App作水平拆分,按照業務拆分紅多個子模塊,之間徹底解耦,經過打包流程控制App功能,這樣方便應對大團隊多人協做,互相邏輯不干擾,這時候只能依賴隱式Intent跳轉,書寫麻煩,成功與否難以控制

頁面路由能夠解決什麼問題?android

 

 

2、頁面路由框架ARouter介紹

1.經常使用功能介紹

應用內頁面跳轉web

添加依賴api

 

舒適提示:api 的版本和 compiler 的版本號須要用最新的。最新的版本在 Github上能夠找到。數組

重寫Application並初始化ARouter安全

 
 

配置將要跳轉的頁面bash

 

進行簡單的頁面跳轉

 

 

舒適提示:若是你想實現像 startActivityForResult() 功能,能夠這樣使用

 

運行結果以下:

 
 

攜帶參數進行頁面跳轉

 

舒適提示:支持數據類型以下:

//基礎類型 .withString( String key, String value ) .withBoolean( String key, boolean value) .withChar( String key, char value ) .withShort( String key, short value) .withInt( String key, int value) .withLong( String key, long value) .withDouble( String key, double value) .withByte( String key, byte value) .withFloat( String key, float value) .withCharSequence( String key, CharSequence value) //數組類型 .withParcelableArrayList( String key, ArrayList<? extends Parcelable > value) .withStringArrayList( String key, ArrayList<String> value) .withIntegerArrayList( String key, ArrayList<Integer> value) .withSparseParcelableArray( String key, SparseArray<? extends Parcelable> value) .withCharSequenceArrayList( String key, ArrayList<CharSequence> value) .withShortArray( String key, short[] value) .withCharArray( String key, char[] value) .withFloatArray( String key, float[] value) .withCharSequenceArray( String key, CharSequence[] value) //Bundle 類型 .with( Bundle bundle ) //Activity 跳轉動畫 .withTransition(int enterAnim, int exitAnim) //其餘類型 .withParcelable( String key, Parcelable value) .withParcelableArray( String key, Parcelable[] value) .withSerializable( String key, Serializable value) .withByteArray( String key, byte[] value) .withTransition(int enterAnim, int exitAnim) 
 

運行程序,結果以下圖所示:

 
 

路由監聽
在路由跳轉的過程當中,咱們能夠監聽路由的過程,只須要如下使用:

navigation(Context context, NavigationCallback callback)

NavigationCallback 的源碼以下:

public interface NavigationCallback { /** * Callback when find the destination. * 找到了 * @param postcard meta */ void onFound(Postcard postcard); /** * Callback after lose your way. * 找不到了 * @param postcard meta */ void onLost(Postcard postcard); /** * Callback after navigation. * 跳轉完了 * @param postcard meta */ void onArrival(Postcard postcard); /** * Callback on interrupt. * 被攔截了 * @param postcard meta */ void onInterrupt(Postcard postcard); } 

添加用於測試跳轉的頁面

 
 

在跳轉的頁面中添加監聽代碼

 

運行結果以下:

 
 
 

攔截器使用
添加須要跳轉的頁面

 

添加攔截器

 

在主頁面進行跳轉攔截測試

 

路由分組
在前面咱們講到在對 Activity1 作註解的時候,用到了

@Route(path = "/com/Activity1") public class Activity1 extends AppCompatActivity {} 

  在 path 這個字符串裏面,」com」 就表明組的標識;「Activity1」 表明是 Activity1 類的具體表示。組的標識和類的標識均可以本身定義的,須要記住的是組標識和類標識之間用斜槓來區分 」\」 .

什麼是組?
  這裏就須要提下,ARouter框架是分組管理,按需加載。提起來很高深的樣子呢!其實解釋起來就是,在編譯期框架掃描了全部的註冊頁面/服務/字段/攔截器等,那麼很明顯運行期不可能一股腦所有加載進來,這樣就太不和諧了。因此就分組來管理,ARouter在初始化的時候只會一次性地加載全部的root結點,而不會加載任何一個Group結點,這樣就會極大地下降初始化時加載結點的數量。好比某些Activity分紅一組,組名就叫test,而後在第一次須要加載組內的某個頁面時再將test這個組加載進來。

測試一下:

ARouter.getInstance()
       .build("/wxc/Activity1") .navigation(this, new NavCallback() { @Override public void onArrival(Postcard postcard) { String group = postcard.getGroup(); Log.e("zhao", "分組是: " + group); } }); 

結果是

07-27 17:32:17.880 19449-19449/com.router E/zhao: 分組是: wxc

ARouter 默認狀況下的分組就是第一個 / / 之間的內容。

自定義分組
  建立 CustomGroupActivity 而且添加 註解,而且指定路由分組。自定義分組的就是在原來的註解上添加 group 字段, 以下所示。

@Route(path = "/com/CustomGroupActivity" , group = "customGroup") public class CustomGroupActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_custom_group); } } 

自定義分組,發起路由:第二個參數就是路由的分組

build(String path, String group) 

具體實現以下所示:

ARouter.getInstance().build("/com/CustomGroupActivity", "customGroup").navigation(); 

URL 跳轉
web url 跳轉流程圖

 

建立URL 中間跳轉頁
建立 URLReceiveActivity

/** * URL 中轉Activity */ public class URLReceiveActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView( R.layout.activity_url_receive ); //對URI 數據分發 Uri uri = getIntent().getData(); ARouter.getInstance().build(uri).navigation(this, new NavCallback() { @Override public void onArrival(Postcard postcard) { finish(); } }); } } 

URLReceiveActivity 添加註冊

<activity android:name=".URLReceiveActivity"> <!-- Schame --> <intent-filter> <data android:host="zhaoyanjun" 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> 

這裏面的 host 、scheme 字段很重要。點擊 url 會根據這兩個字段會調起本地的 Activity 。

下面是一段 HTML 片斷

<h2>1:URL普通跳轉</h2> <p><a href="arouter://zhaoyanjun/com/URLActivity1">arouter://zhaoyanjun/com/URLActivity1 </a> </p> <h2>2:URL普通跳轉攜帶參數</h2> <p> <a href="arouter://zhaoyanjun/com/URLActivity2?name=alex&age=18&boy=true&high=180&obj=%7b%22name%22%3a%22jack%22%2c%22id%22%3a666%7d">arouter://zhaoyanjun/test/URLActivity2?name=alex&age=18&boy=true&high=180&obj={"name":"jack","id":"666"} </a> </p> 

注意 a 標籤裏面的 arouter://zhaoyanjun 分別表明着 scheme 、host ;/com/URLActivity1 就是目標 Activity 的註解。

若是須要接收 URL 中的參數,須要在 Activity 調用自動注入初始化方法;

ARouter.getInstance().inject(this); 

須要注意的是,若是不使用自動注入,那麼能夠不寫 ARouter.getInstance().inject(this),可是須要取值的字段仍然須要標上 @Autowired 註解,由於 只有標上註解以後,ARouter才能知道以哪種數據類型提取URL中的參數並放入Intent中,這樣您才能在intent中獲取到對應的參數

具體的代碼以下:

@Route(path = "/com/URLActivity2") public class URLActivity2 extends AppCompatActivity{ private TextView textView; @Autowired String name; @Autowired int age; @Autowired boolean boy; @Autowired int high; @Autowired String obj ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ARouter.getInstance().inject(this); setContentView(R.layout.activity_url2); textView = (TextView) findViewById(R.id.tv); //解析參數 Bundle bundle = getIntent().getExtras(); String name1 = bundle.getString("name"); textView.setText("參數是: " + "name: " + name + " age: " + age + " boy: " + boy + " name1: " + name1 + " obj: " + obj.toString() ); } } 

效果圖以下:

 

暴露服務
  這裏說到的服務不是Android四大組件中的Service,這裏的服務是接口開發的概念,就是將一部分功能和組件封裝起來成爲接口,以接口的形式對外提供能力,因此在這部分就能夠將每一個功能做爲一個服務,而服務的實現就是具體的業務功能。

咱們先自定義一個接口 IService 而且繼承 IProvider 。IService 接口裏面有一個 sayHello() 方法,具體代碼以下。

public interface IService extends IProvider { void sayHello(Context context ); } 

先定義一個 IService 的實現類 MyService 而且添加註解,代碼以下

@Route(path = "/service/hello", name = "測試服務") public class MyService implements IService { @Override public void sayHello( Context context ) { Toast.makeText( context , "hello", Toast.LENGTH_SHORT).show(); } @Override public void init(Context context) { } } 

發現服務,首先定義服務對象,而且添加註解,咱們不須要知道接口的具體實現類。

@Autowired(name = "/service/hello") IService service; 

而後添加註解初始化,自動賦值。

ARouter.getInstance().inject(this); 

最後咱們調用 service 裏面的 sayHello() 方法。

service.sayHello(this); 

發現服務這個功能的特色在於,咱們只須要知道接口,不須要關心接口的實現類,很好了實現瞭解耦。

路由關閉

ARouter.getInstance().destroy(); 

舒適提示:該功能慎用,搞很差整個app頁面跳轉就gg了。

代碼混淆
  若是咱們使用了Proguard進行代碼混淆,能夠添加如下代碼

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

2.常見應用場景

  1. 從外部URL映射到內部頁面,以及參數傳遞與解析
    說明:該場景使用到了該文章的URL跳轉和暴露服務功能,這樣使得頁面跳轉功能很好的解耦,特別對於團隊開發有很好管理做用。
  2. 跨模塊頁面跳轉,模塊間解耦
  3. 處理登錄、埋點等邏輯
    說明:該場景使用到了路由監聽和攔截跳轉等功能,在原始處理登錄、埋點等功能中,咱們會先初始化Activity,再進行邏輯判斷,這樣會影響性能,若是咱們使用了監聽和攔截,那麼在初始化新的Activity以前,咱們能夠先進行邏輯判斷。

3、源碼下載

連接:https://pan.baidu.com/s/1Y7Br3iKlDb-55VG1kAU70A
提取碼:m0at

4、參考文章

    1. https://www.cnblogs.com/zhujiabin/p/7193400.html
    2. https://blog.csdn.net/x605940745/article/details/80583912
    3. https://blog.csdn.net/zhaoyanjun6/article/details/76165252

原文出處:https://www.cnblogs.com/WUXIAOCHANG/p/10550408.html

相關文章
相關標籤/搜索