組件化/模塊化的快速入門及使用之:阿里路由框架ARouter的基本使用。

前言:這篇模塊化與組件化的文章,用2篇文章介紹。可能有些人以爲網上已經有了文章,爲何還要寫。第一:爲了記錄本身的正常也算當作筆記。第二:網上當然有好文,但最近看了一篇竟然有150多贊,可是介紹的迷迷糊糊,不少知識點略過。本文重點是讓你快速入門,理解以及使用。java

本次模塊化/組件化講解總共分2篇(必須先了解ARouter,或第三方路由框架):
一、阿里路由框架ARouter的基本使用
二、Android中經過對gradle的管理實現組件化;並配合ARouter,隨意跳轉切換android

這裏爲何會使用路由框架呢,爲了讓模塊之間相互通訊,好比你你項目 引入Module A。同時引入了 Module B。項目能夠同時訪問A和B。但此時A要訪問B,B要訪問A怎麼辦呢。這時候就須要路由框架去解決了。這只是一方面而已。git

一、添加依賴

首先放上ARouter的github地址
app build.gradle的dependencies標籤加上github

implementation 'com.alibaba:arouter-api:1.3.1'
 annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
複製代碼


在android標籤下的defaultConfig加上javaCompileOptions:api

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

    }
    
}
複製代碼

二、初始化

在application裏初始化,記得在發佈線上版本,要日誌和debug關閉,代碼以下:app

public class MyApplication extends Application {
    //ARouter 調試開關
    private boolean isDebugARouter = true;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
        if (isDebugARouter) {
            //下面2行必須卸載ARouter init 之間,不然無效
            //打印日誌
            ARouter.openLog();
            //開啓調試模式(若是在InstantRun的模式下必須開啓,線上必須關閉)
            ARouter.openDebug();
        }

        // 官方建議在Application中初始化
        ARouter.init(this);
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
        ARouter.getInstance().destroy();
    }

}
複製代碼


同時ARouter的使用有點像Dagger2,須要調用ARouter.getInstance().inject(Object obj);咱們把他封裝在Base裏:框架

public abstract class BaseActivity extends AppCompatActivity {
    //省略部分代碼,便於理解
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());
        ARouter.getInstance().inject(this);
    }
}
複製代碼

三、@Route的使用

在咱們使用的Activity或Fragment裏。使用@Route標註,且path = "/x/y",x爲包名(取最後一位便可),y爲當前類名:ide

@Route(path = "/myapplication/MainActivity")
public class MainActivity extends BaseActivity {
    
}
複製代碼

四、ARouter裏Activity之間的跳轉

Activity與Activity裏的跳轉只需調用以下代碼,build裏的路徑,就是咱們用標註@Route path標註的路徑:模塊化

ARouter.getInstance().build("/myapplication/MainActivity").navigation();
複製代碼

從上面代碼咱們發現。路徑"/myapplication/MainActivity",得統一用個常量類管理起來,否則這樣找起來,簡直費事,以下:組件化

public final class Constance {
    public static final String ACTIVITY_PATH_MAIN = "/myapplication/MainActivity";
}
複製代碼


這裏除了路徑跳轉外,從他的參數類型中,還能看到有Uri跳轉:

Uri uri = Uri.parse(Constance.ACTIVITY_PATH_MAIN);
        ARouter.getInstance().build(uri).navigation();
複製代碼

五、帶參數跳轉 & 獲取參數

帶參數跳轉

只需在後面.withString(),便可,裏面包含了全部你想傳的類型

ARouter.getInstance()
                .build("/myapplication/MainActivity")
                .withString("name", "lihang")
                .withInt("age", 27)
                .withSerializable("human", new Person("力哈", "11"))
                .navigation();
複製代碼

獲取參數

在獲取參數頁面,注意這裏有個大坑:

@Route(path = "/myapplication/SimpleActivity")
public class SimpleActivity extends BaseActivity {
    @Autowired()
    String name;
    @Autowired(name = "age")
    int mAge;
    // @Autowired(name = "human")這裏注意,若是是傳Serializable,註解是得不到的。除非是Paceable
    Person mPerson;

    @Override
    public int getContentViewId() {
        return R.layout.activity_simple;
    }

    @Override
    public void progressLogic() {
// mPerson = (Person) getIntent().getSerializableExtra("human");
    }
}
複製代碼

這裏獲取參數有3種方式:

  • 使用@Autowired標註後,下方的值是之間傳值的key。
@Autowired()
String name;
複製代碼
  • 使用@Autowired標註後,name = key,name等於之間傳值的key,下方參數名隨便定
@Autowired(name = "age")
int mAge;
複製代碼
  • 帶序列化這裏有些特殊,若是是Parcelable類型,能夠用上方的方法獲取。可是若是是Serializable類型,卻會發現,沒辦法獲取到。可是這裏用咱們傳統的getIntent也能獲取到
mPerson = (Person) getIntent().getSerializableExtra("human");
複製代碼

六、帶動畫跳轉

以前咱們要帶動畫跳轉,要用到overridePendingTransition(int anim_in,int anim_out);這裏也有提供,可是有個大坑哦:

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .withTransition(R.anim.alpha_activity_in, R.anim.alpha_activity_out)
                //navigation裏,必定要加上當前的Context,否則動畫不起效
                .navigation(MainActivity.this, 99);
複製代碼


同時ARouter也提供了新版動畫,可是須要api>= 16才能使用,效果仍是很酷炫的:

if (Build.VERSION.SDK_INT >= 16) {
            ActivityOptionsCompat compat = ActivityOptionsCompat.
                    makeScaleUpAnimation(btn, btn.getWidth(), btn.getHeight(), 0, 0);
            ARouter.getInstance()
                    .build(Constance.ACTIVITY_PATH_SIMPLE)
                    .withOptionsCompat(compat)
                    .navigation();
        }else {
            ToastUtils.showToast("api <16,不支持新版動畫");
        }
複製代碼

七、相似Activity裏的startActivityForResult(Intent intent, int requestCode);

帶requestCode跳轉

也是在.navigation()裏,只要帶上requestCode就Ok了。而後onActivityResult和正常使用同樣。

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(Context context, int requestCode);
複製代碼

setResult返回界面,你沒看錯,就是這麼複雜!

Postcard postcard = ARouter.getInstance().build(Constance.ACTIVITY_PATH_MAIN);
        LogisticsCenter.completion(postcard);
        Class<?> destination = postcard.getDestination();
        Intent intent = new Intent(SimpleActivity.this, destination);
        setResult(1, intent);
        finish();
複製代碼

八、Fragment的使用

之間說了Activity和Fragment都須要用@Route標註加上path。 這裏Fragment的使用和Activity同樣,但惟一的區別是,Activity是跳轉,而Fragment是實例化Fragmen的實例,以下:

//記得要強轉一下,這裏傳值什麼的和Activity的用法同樣。
HomeFragment homeFragment = (HomeFragment)ARouter.getInstance().build(Constance.Fragment_PATH_SIMPLE).navigation();
複製代碼

九、攔截器的使用

咱們先看一段攔截器的代碼:

@Interceptor(priority = 1)
public class FirstInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        if (postcard.getPath().equals(Constance.ACTIVITY_PATH_SIMPLE)){
            LogUtils.i("ARouter攔截器", "FirstInterceptor 開始攔截 ======");
        }
        callback.onContinue(postcard);
    }
    @Override
    public void init(Context context) {
        LogUtils.i("ARouter攔截器", "first init");
    }
}
複製代碼

一、攔截器使用很奇特,只要在你代碼裏寫上這個類,就起做用了。估計@Interceptor標註,apt幫咱們幹了很多事。

二、首先用@Interceptor標註,(priority = 1)優先級,越小,越先執行。

三、實現IInterceptor接口。實現2個方法:init(),process()。

四、init()方法,在項目啓動時候首先執行,process()方法在Activity跳轉時調用

五、若是咱們要爲攔截器加上一些帥選條件的話能夠經過Postcard

六、注意,只要設置了攔截器,這裏不調用callback.onContinue(postcard);就會卡在當前的攔截器內。固然跳轉就卡在當前頁面。


十、跳轉時加監聽,配合攔截器使用

直接上代碼。在代碼裏註釋

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(MainActivity.this, new NavigationCallback() {
                    @Override
                    public void onFound(Postcard postcard) {
                        //路由目標被發現時調用(Activity執行跳轉代碼,第一個執行)
                        //group 爲路徑的組。若是不自定義,會默認成path的/x/y的x
                        //group 能夠自定義,如:@Route(path = Constance.ACTIVITY_PATH_MAIN,group = Constance.GROUP_FIRST)
                        //固然自定義組以後,跳轉的時候要帶上組名。
                        String group = postcard.getGroup();
                        //path 爲全路徑@Route(path = Constance.ACTIVITY_PATH_MAIN)
                        String path = postcard.getPath();
                        LogUtils.i("ARouter攔截器", "onFound ------> group == " + group + " " + "path == " + path);
                    }

                    @Override
                    public void onArrival(Postcard postcard) {
                        //路由到達後調用(注意這裏是全部攔截器執行完以後纔會調用)
                        String group = postcard.getGroup();
                        String path = postcard.getPath();
                        LogUtils.i("ARouter攔截器", "onArrival ------> group == " + group + " " + "path == " + path);
                    }

                    @Override
                    public void onLost(Postcard postcard) {
                        //路由被丟失時調用
                        LogUtils.i("ARouter攔截器", "onLost");
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {
                        //路由被攔截時調用
                        LogUtils.i("ARouter攔截器", "onInterrupt");

                    }

                });
複製代碼

結束語:ARouter的使用就是這樣。目前在瘋狂學習中。有志同道合或者想跟我一塊兒學習的請加QQ羣:209010674。也是爲明年有更好的出入準備着。若是也對你有幫助,給我個贊,給我鼓勵把。

相關文章
相關標籤/搜索