1.在开发比较大的项目,就要考虑模块化,把整个项目划分成n个模块。这样做每个模块负责一个业务系统,方便后期的迭代开发,使得项目部没那么臃肿。分开编译,每个模块可以单独运行。最后把每个模块都添加到一个宿主APP 合并为一个完整的项目。

那么分模块后,界面之间的跳转就是一大问题。用Alibaba的ARouter开源库,就解决这问题。

在传统的项目中 ,我们业务都在一个模块下面。界面和界面的跳转就是用Intenter .这样做就使得代码耦合度很高.startActivity(new intenter(testActivity.this,test2Activity.class));  ,还有一种就是隐式的跳转方式 

Intent intent = new Intent();

intent.setAction(“com.android.activity.MY_ACTION”);  

startActivity(intent);  这个Action 也要在Mainfest.xml注册。也有弊端扩展性很差。

再分模块的项目和一个模块下 界面与界面的跳转  我们都可以用ARouter框架.

2.接下来就在自己的项目中用起来,我这里写一个Demo

阿里巴巴开源的路由gitHub地址:https://github.com/alibaba/ARouter    

打开它的地址,按照他的配置添加相关的依赖。主要就是这2个地方 .再同步一下工程不报错就说明引入成功。

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

}
dependencies {
		
    implementation 'com.alibaba:arouter-api:1.5.0'  //这里的版本根据github上面lastest version为准
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'    //这里的版本根据github上面lastest version为准
}

3.建一个全局的application 初始化相关的配置

public class MyApplication extends Application {
    boolean isDebug=true;
    @Override
    public void onCreate() {
        super.onCreate();
        if (isDebug){   
//这2个必须要在初始化之前开启。These two lines must be written before init, otherwise these configurations will be //invalid in the init process
            ARouter.openLog();
            ARouter.openDebug(); 
 //  Turn on debugging mode (If you are running in InstantRun mode, you must turn on debug mode! Online version //needs to be closed, otherwise there is a security risk)
        }
        ARouter.init(this);   //初始化SDK   As early as possible, it is recommended to initialize in the 
    }
}

4.新建2个测试activity 

public class MainActivity extends AppCompatActivity {
     Button but_onClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }
    private void initView() {
        but_onClick=(Button) findViewById(R.id.but_onClick);
    }
    private void initEvent() {
                //  点击界面跳转
            but_onClick.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //1.简单的跳转
        //  ARouter.getInstance().build("/test/testActivity").navigation();  //这里的path就是要跳转到界面去的注解地址
                    //2. 一般界面跳转都要携带参数
                    ARouter.getInstance().build("/test/testActivity")
                            .withString("userName","张三")
                            .withInt("age",123)
                            .navigation();
                }
            });
    }

}

5.这是跳转到的界面

// Add annotations on pages that support routing (required)
// The path here needs to pay attention to need at least two levels : /xx/xx    至少2级
@Route(path = "/test/testActivity")
public class TestActivity extends AppCompatActivity {
    @Autowired
    public String userName;
    @Autowired
   public int age;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ARouter.getInstance().inject(this);   //注入
        Log.d("TAG",userName+age);
    }
}

6.上面就是在一个模块下界面的跳转,其实也很简单,还有Fragment 的跳转 ,套路都一样,看它给的API就可以 。

7.在新建一个模块,但是这个模块不是一个应用,而是一个库就是一下2个的区别 

apply plugin: 'com.android.application'     apply plugin: 'com.android.library' 

8.这里画了一个大概的图:

9.我的项目结构图:

10.在app的 build.gradle下添加3个模块依赖:baselib,secondtest,testmoudle.如图所示:

11.我这里从宿主app MainActivity界面跳转到baselib 的ThreeActivity界面:

public class MainActivity extends AppCompatActivity {
     Button but_onClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initEvent();
    }
    private void initView() {
        but_onClick=(Button) findViewById(R.id.but_onClick);
    }
    private void initEvent() {
                //  点击界面跳转
            but_onClick.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //1.简单的跳转
        //  ARouter.getInstance().build("/test/testActivity").navigation(); //这里的path就是要跳转到界面去的注解地址
                    //2. 一般界面跳转都要携带参数
                 ARouter.getInstance().build("/test/demoActivity")
                            .withString("userName","张三")
                            .withInt("age",123)
                            .navigation();



                }
            });

    }

}
@Route(path = "/test/demoActivity")
public class ThreeActivity extends AppCompatActivity {
    Button but_test;
    @Autowired
    public String userName;
    @Autowired
    public int age;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        ARouter.getInstance().inject(this);
        Log.d("TAG",userName+age);

    }

}

12.模块之间的界面跳转和数据的传递:在baselib 和testmoudle 2个模块下做界面跳转和数据的传递

@Route(path = "/test/demoActivity")
public class ThreeActivity extends AppCompatActivity {
    Button but_test;
    @Autowired
    public String userName;
    @Autowired
    public int age;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_three);
        ARouter.getInstance().inject(this);
        Log.d("TAG",userName+age);
            initView();

    }
    private void initView() {
        but_test=(Button) findViewById(R.id.but_test);
        but_test.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ARouter.getInstance().build("/testmoudle1/MainActivity")
                        .withString("userName","张三")
                        .withInt("age",123)
                        .navigation();


            }
        });
    }

}
@Route(path = "/testmoudle1/MainActivity")
public class FiveActivity extends AppCompatActivity {
    @Autowired
    public String userName;
    @Autowired
    public int age;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_five);
        ARouter.getInstance().inject(this);
        Log.d("TAG","testmoudle"+userName+age);
    }
}

总结:

我在公共的baselib  build.gradle文件下引入了相关的配置文件。而又要在其他模块中引入配置文件 。不引入就报错  有点搞不清楚。就这3个东西。这里只做了界面跳转和数据的传递。其他的操作下一次更新。

javaCompileOptions {
    annotationProcessorOptions {
        arguments = [AROUTER_MODULE_NAME: project.getName()]
    }
}
implementation 'com.alibaba:arouter-api:1.5.0'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

 

 

 

 

 

 

 

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐