ARouter

作者: 天空的守望者 | 来源:发表于2018-07-27 15:32 被阅读0次

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

    ARouter 在模块化的开发中尤为的重要,为了解耦不在需要依赖另一个模块又能实现模块间的跳转,还未了解的可以点上面的链接去了解,这篇文章只是介绍简单的使用方法。

    1.配置:

    gradle 插件大于2.2的可以直接配置

    android {
        defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
            arguments = [ moduleName : project.getName() ]
            }
        }
        }
    }
    
    dependencies {
        // 替换成最新版本, 需要注意的是api
        // 要与compiler匹配使用,均使用最新版可以保证兼容
        compile 'com.alibaba:arouter-api:x.x.x'
        annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
        ...
    }
    
    

    注意:是每个需要跳转的 Module 都需要配置。
    另外,多模块的时候最好能设置一个全局变量,来控制 各个模块间需要相同的属性。
    在全局的 build.gradle 文件中 加入一个 域 如:

        //全局变量
        ext {
            compileSdkVersion = 26
            minSdkVersion = 21
            targetSdkVersion = 26
        }
    
    

    然后在各个子模块中进行配置:

    android {
    
       compileSdkVersion rootProject.ext.compileSdkVersion
        defaultConfig {
            applicationId "moremodule.com.moremoduledemo"
            minSdkVersion rootProject.ext.minSdkVersion
            targetSdkVersion rootProject.ext.targetSdkVersion
            versionCode = 1
            versionName = "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [moduleName: project.getName()]
                }
            }
        }
    }
    
    

    这样 各个模块的配置就统一了。

    2.初始化 ARouter

    在 Application 中初始化:

     @Override
        public void onCreate() {
            super.onCreate();
            ARouter.openLog();     // 打印日志
            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
            ARouter.init( this ); // 尽可能早,推荐在Application中初始化
        }
    
    
    3.在目标页面添加注解
    //地址最少两级  /xx/xxx
    @Route(path = "/app/Main2Activity")
    public class Main2Activity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main2);
        }
    }
    
    

    然后在需要跳转的页面发起路由操作

     switch (v.getId()) {
                case R.id.bt_one:
                    ActivityOptionsCompat compat = ActivityOptionsCompat.
                            makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);
                    ARouter.getInstance()
                            .build("/app/Main2Activity")
                            .withOptionsCompat(compat)//动画效果
                            .navigation();
                    break;
    
    

    如果出现这样的情况一般是:
    通常来说这种情况是没有找到目标页面,目标不存在
    如果这个页面是存在的,那么您可以按照下面的步骤进行排查
    检查目标页面的注解是否配置正确,正确的注解形式应该是 (@Route(path="/test/test"), 如没有特殊需求,请勿指定group字段,废弃功能)

    提示
    4.带值的跳转

    支持可以带的值如下:

    带值跳转的方式

    例如:

     ARouter.getInstance()
        .build("/One/ModuleOneActivity")
        .withString("test","测试")
        .navigation();
    
    

    目标页面:

    @Route(path = "/One/ModuleOneActivity")
    public class ModuleOneActivity extends BaseActivity {
        private Button bt;
        private TextView tv;
        private String test;
    
        @Override
        protected void initView() {
            bt = findViewById(R.id.bt_module_one);
            tv = findViewById(R.id.tv_module_one);
            bt.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                tv.setText(test);
                }
            });
        }
    
        @Override
        protected void setContentView() {
            setContentView(R.layout.activity_module_one);
            Intent intent = getIntent();
            test=intent.getStringExtra("test");
        }
    }
    
    

    这样就得到了传过来的值。

    5.Fragment跳转

    要跳转到Fragment 只要在关联Fragmentd 的Activity 中获取到 Fragment 就可以了,其他步骤和正常的流程一样:

    @Route(path = "/Two/ModuleTwoActivity")
    public class ModuleTwoActivity extends BaseActivity {
        private FrameLayout frameLayout;
        private Fragment fragment;
    
        @Override
        protected void initView() {
            frameLayout = findViewById(R.id.frame_layou);
            FragmentManager manager = getFragmentManager();
            FragmentTransaction fragmentTransaction = manager.beginTransaction();
            fragment = (Fragment) ARouter.getInstance().build("/com/TestFragment").navigation();//获取到 Fragment 不是v4包的
            fragmentTransaction.replace(R.id.frame_layou, fragment);
            fragmentTransaction.commit();
        }
    
    
    6.通过URL跳转,和获取URL中的参数

    可以写一个 URL 接收的中转页面,

    @Route(path = "/app/URLActivity")
    public class URLActivity extends AppCompatActivity {
        @Autowired
        String type;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_url2);
            ARouter.getInstance().inject(this);
            Toast.makeText(URLActivity.this,type,Toast.LENGTH_SHORT).show();
    
        }
    }
    
    

    在 清单文件配置

                <!-- Schame -->
                <intent-filter>
                    <data
                        android:host="insane"
                        android:scheme="arouter" />
    
                    <action android:name="android.intent.action.VIEW" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="android.intent.category.BROWSABLE" />
                </intent-filter>
    
    

    其中 这里面的 host 、scheme 字段很重要。点击 url 会根据这两个字段会调起本地的 Activity 。如上面那样写就是:

    arouter://insane/app/URLActivity?type=test   //type=test 测试获取的参数
    
    

    app/URLActivity 是目标页面的注解

    @Route(path = "/app/URLActivity")
    public class URLActivity extends AppCompatActivity {
       //对需要取值的参数加上这个注解,路由才能识别
        @Autowired 
        String type;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_url2);
            ARouter.getInstance().inject(this);  //自动注入
            Toast.makeText(URLActivity.this,type,Toast.LENGTH_SHORT).show();
    
        }
    }
    
    
    页面

    这样就获取到了。

    ARouter 还有很多更厉害的功能,还在逐步学习中。

    参考:https://www.jianshu.com/p/2f8a960ac6d8

    相关文章

      网友评论

          本文标题:ARouter

          本文链接:https://www.haomeiwen.com/subject/nskgmftx.html