ARouter

阿里巴巴开源的路由: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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 组件化 模块化、组件化与插件化 在项目发展到一定程度,随着人员的增多,代码越来越臃肿,这时候就必须进行模块化的拆分...
    silentleaf阅读 4,896评论 2 12
  • 又是一年中重要的日子来临——高考,这是个充满希望也充满压抑的词,它仿佛是一扇门,我们前十几年孤注一掷的努力只为了拿...
    爱丽丝姑娘阅读 499评论 0 1
  • 猫头鹰(精准型):代表人物,包拯,主流国家:日本 个性特点:很传统,注重细节,条理分明,责任感强,重视纪律,保守,...
    垚尧进化史阅读 648评论 0 1
  • 《无问西东》剧情简介:如果提前了解了你所要面对的人生,你是否还会有勇气前来?吴岭澜、沈光耀、王敏佳、陈鹏、张果果,...
    周梵阅读 817评论 0 1
  • 西直门地铁入口的两侧换上了新装,不记得原本是什么模样,只知道如今是贴上了一层打广告的塑料墙纸,背景设计成了图书馆的...
    HF的平方阅读 275评论 0 0