android 架构相关知识

android 组件化路由框架

2019-12-27  本文已影响0人  android源码探索

欢迎大家下载我个人开发的app安琪花园

gitHub地址

使用


在项目的根目录下面的build.gralde添加maven仓库。

 maven { url "https://dl.bintray.com/richzjc/maven" }

其次是在module的build.gradle引用

如果项目用的kotlin 请将annotationProcessor 改成kapt
annotationProcessor "com.richzjc:router_compiler:1.0.25"
implementation "com.richzjc:router_lib:1.0.25"

简介


该项目是在我同事写的路由库基础之上,做了二次封装。
同事写的路由地址
我二次封装后的地址是: 路由库地址

功能描述


  1. 可以支持给Activity配置路由
  2. 可支持给Fragment配置路由
  3. 可以给实现RouterCallback的类配置路由

使用步骤


  1. 在对应的gradle文件下面添加如下配置,(注意: 一定是配置在defaultConfig下面)
android {
    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName: project.getName()]
            }
        }
    }
}

  1. 在activity的类上面添加注解
@BindRouter(urls = {"https://wwww.github.com"})
public class TestActivity extends Activity {

}

注解的上面还可以添加参数 比如:

@BindRouter(urls = { "https://github.com/leifzhang"}, weight=10)
 public class TestActivity extends Activity {

 }
  1. 在Callback上面添加注解
@BindRouter(urls = {"https://wwww.baidu.com"}, isRunnable = true)
public class SimpleCallBack implements RouterCallback {
    @Override
    public void run(RouterContext context) {
        Toast.makeText(context.getContext(), "testing", Toast.LENGTH_SHORT).show();
    }
}
  1. 最后一步
Router.sharedRouter().open(路由地址, Context); 

注意: 路由地址最好是以schema://host/path这种结构组成

Fragment配置路由


为什么fragment要单独说呢? 因为fragment的路由涉及到运行时注解,而不是编译时注解。
fragment的路由的用途是:

比如一个页面用的Viewpager + fragment来实现的, 当给fragment配置路由后, 直接通过fragment的路由会跳转到对应的页面,并定位到对应的fragment
比如一个页面是用TabHost + fragment来实现,同样的也可以通过fragment的路由定位到对应的tab

第一步

给fragment配置路由

  1. 通过注解配置路由
@FragmentRouter(url = Global.NEWS_MAINFRAGMENT_ROUTER)
public class NewsMainFragment extends BaseTabFragment{
}
  1. 通过接口配置路由, 实现IFragmentRouter接口
public class LiveFragment extends BaseRecyclerViewFragment<LiveEntity, LiveRecyclerCallBack, LivePresenter> implements  IFragmentRouter {

  @Override
    public String getFragmentRouter() {
        Bundle bundle = getArguments();
        String channel = "";
        if(bundle != null){
            channel = bundle.getString("key", "");
        }
        return Global.LIVE_TAB_LIVE_SUB_FRAGMENT + channel;
    }
}

第二步, 注册路由

        //Vip tab 的 脱水研报
        FragmentRouterModel model18 = new FragmentRouterModel.Builder()
                .nextFragmentRouter(Global.NEWS_VIP_ROUTER)
                .nextFragmentRouter(Global.MEMBER_CLUB_DETAIL_ACTION + "dehydration")
                .build();

        //Vip tab 的 Vip 会员
        FragmentRouterModel model19 = new FragmentRouterModel.Builder()
                .nextFragmentRouter(Global.NEWS_VIP_ROUTER)
                .nextFragmentRouter(Global.MEMBER_CLUB_DETAIL_ACTION + "gold")
                .nextFragmentRouter(Global.NEWS_VIP_GOLD_SUB_ROUTER)
                .build();

        Router.map(Global.ALIEN_MAINACTIVITY_ACTION, MainActivity.class,
                model18,
                model19);

首先是给Activity设置路由, 如果要跳转到A页面的B Fragment里面的C Fragment,则
要分别给B Fragment和C Fragment设置路由,并且通过FragmentRouterModel设置进去。

第三步, 配置SubFragmentRouters注解

@SubFragmentRouters(fragmentType = SubFragmentType.VIEWPAGER_FRAGMENTS, widgetIdName ="vp_news_main", filedName = "fragments")
public class NewsMainFragment extends BaseTabFragment<NewsMainCallBack, NewsMainPresenter>{
}

比方说: 如果要跳转到B Fragment下面的子fragment,则需要在B Fragment上面配置SubFragmentRouters注解。

subFragmentRouter注解解释:
fragmentType: 目前只支持像tabHost,和 ViewPager这两种
widgetIdName: tabHost, ViewPager的xml文件里面的id名字
fieldName: 是针对ViewPager里面的fragment列表的名字。如(List<Fragment> fragments)

最后fragment的跳转

Router.sharedRouter().open(路由地址, Context); 

公众号:

qrcode_for_gh_c78cd816dc53_344.jpg
上一篇 下一篇

猜你喜欢

热点阅读