該用路由來管理你的界面跳轉(zhuǎn)了

一般情況來說,我們做界面跳轉(zhuǎn)直接調(diào)用starActivity方法即可;當(dāng)然你不考慮后續(xù)維護(hù),程序不會多變,你可以一直這么用下去,沒什么大礙;但是我們程序一般維護(hù)到底,直到下線為止;那么就該盡量的對程序做維護(hù)做優(yōu)化了,比如對界面的跳轉(zhuǎn)做優(yōu)化;
路由的概念并不陌生,用它主要有以下一些好處

1,對activity的跳轉(zhuǎn)做統(tǒng)一的管理
2,對跳轉(zhuǎn)的結(jié)果,過程,可控
3,遍歷來至于外部的跳轉(zhuǎn)
4,便于維護(hù)
5,組件化必備
.....

直接看用法,這里使用阿里巴巴的Aroute
一,引入框架

compile 'com.alibaba:arouter-api:1.4.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.1'
 defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }

二,配置路由路徑
path為跳轉(zhuǎn)的路由路徑,extras 為攔截策略

@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
    }

}

三,跳轉(zhuǎn)界面

 ARouter.getInstance().build("/app/order").navigation()

這種跳法呢最主要的是解決組件化跳轉(zhuǎn)的問題,因?yàn)槎嗄K是找不到類名的;
道然如果不是組件化的程序,也是值得我們一用的
舉個(gè)栗子:
平時(shí)我們跳轉(zhuǎn)界面可能會寫下面的代碼,先檢測是否登錄,才能跳轉(zhuǎn),如果只是一小段這樣的邏輯,隨便怎們寫都無所謂;但是如果有很多重復(fù)的邏輯,比如有很多地方可以調(diào)到訂單界面,那就要寫很多這樣的代碼,有一天邏輯變了或者說不僅要判斷登錄,還要判斷用戶有沒有綁定手機(jī)號,想想就很惡心啊;

boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin", false);
                if (isLogin) {
                    callback.onContinue(postcard);
                } else {
                    callback.onInterrupt(new Exception("請先登錄"));
                }

那么就可以用到攔截器來解決這個(gè)問題,優(yōu)雅而大方的做到全局的控制
1,為了萬一哪天要組件化,我們最好把路由的跳轉(zhuǎn)拿出來放到基礎(chǔ)包里,哪天組件化了也好進(jìn)行抽離,不要封裝到Activty里面;

鍵入我們先簡單的封裝倆個(gè)統(tǒng)一的跳轉(zhuǎn)方法,一個(gè)帶參數(shù),一個(gè)不帶參數(shù),callBack封裝一個(gè)自己的來處理自己的邏輯

/**
     * 不帶參數(shù)跳轉(zhuǎn)
     * @param context
     * @param path
     */
    public static void toActivity(final Context context, String path) {
        ARouter.getInstance().build(path).navigation(context, new MyNavigationCallback(context));
    }


    /**
     * 帶參數(shù)跳轉(zhuǎn)
     * @param context
     * @param path
     * @param bundle
     */
    public static void toActivity(final Context context, String path, Bundle bundle) {
        ARouter.getInstance().build(path)
                .withBundle("data", bundle).navigation(context, new MyNavigationCallback(context));
    }

NavigationCallback

public class MyNavigationCallback implements NavigationCallback {

    private Context context;

    public MyNavigationCallback(Context context) {
        this.context = context;
    }

    @Override
    public void onFound(Postcard postcard) {

    }

    @Override
    public void onLost(Postcard postcard) {

    }

    @Override
    public void onArrival(Postcard postcard) {

    }

    @Override
    public void onInterrupt(final Postcard postcard) {
        //假設(shè)值處理onInterrupt方法,這里只把為什么被攔截的信息打出來
        new Handler(context.getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(context, (String) postcard.getTag(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

二,然后的定義一組攔截的策略,因?yàn)樗@里定義的攔截器是全局的,如果你不定義策略做處理,進(jìn)本所有的界面都會被攔截
假設(shè)我們只定義一個(gè)策略

public interface ArouteConfig {
    int STRATEGY1 = 1;//攔截登錄
}

三,那么就可以開始寫一個(gè)攔截器了
在攔截器中我們對所有的策略做一個(gè)處理,根據(jù)每個(gè)策略的具體做法,比如策略1我們只攔截登錄,那么就要在登錄里判斷,如果是策略1就去做處理;比如在策略2中我們攔截登錄和綁定手機(jī)號,那么在登錄中判斷如果是策略2也要做處理,在手機(jī)號攔截中也要判斷,整個(gè)攔截器的機(jī)制其實(shí)和okhttp的機(jī)制很像,是根據(jù)攔截的級別去鏈?zhǔn)秸{(diào)用的

@Interceptor(priority = 1, name = "loginInterceptor")
public class OrderInterceptor implements IInterceptor {


    private Context context;

    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        int extra = postcard.getExtra();
        switch (extra) {
            //攔截登錄
            case ArouteConfig.STRATEGY1:
                boolean isLogin = SharedPreferencesTool.getBoolean(context, "isLogin", false);
                if (isLogin) {
                    callback.onContinue(postcard);
                } else {
                    callback.onInterrupt(new Exception("請先登錄"));
                }
                break;
            //什么都不攔截
            default:
                callback.onContinue(postcard);
                break;
        }

    }

    @Override
    public void init(Context context) {
        this.context = context;
    }
}

上面便是登錄的攔截器,看到在策略1中去做判斷,其他的神們都不管.
四,配置Activity的攔截策略
如果不需要進(jìn)行攔截extras 就不需要配置了


@Route(path = "/app/order", extras = ArouteConfig.STRATEGY1)
public class OrderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_order);
    }

}

以上就是路由的有個(gè)大體用法,當(dāng)然還有很多方便的東西,比如全局的降級,外部scheme的處理等等...總之該徹底拋棄系統(tǒng)的跳轉(zhuǎn)方法了;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容