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'