组件间跳转
目录
- 隐式跳转
- ARouter 路由
- 参考
隐式跳转
在组件化中,两个功能模块是不存在直接依赖的,其依赖规则可通过 Base Module 间接依赖。
- 直接依赖
一般直接跳转是从一个 Activity 跳转到另一个 Activity,使用 startActivity 发送一个包装好的 Intent 对象,将 Intent 对象交给 ActivityManagerService 完成新的 Activity 创建。
- 间接依赖
使用直接依赖虽然简单,但是当引用了其他模块的 Activity 时,当其他模块的类名、包名等发生改变时也会发生索引不到 Activity 的情况。这时可通过使用 Intent 对象包装隐式 action 是的方式来实现跳转。
<activity android:name=".BaseActivity">
<intent-filter>
<action android:name="cn.demon.base.BaseActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
public void onBaseActivityClick(View view) {
startActivity(new Intent("cn.demon.base.BaseActivity"));
}
ARouter 路由跳转
路由的概念被广泛的使用在计算机网络当中,他是指路由器从一个接口上收到的数据包根据路由表查询路由包里的目的地址,并将其转发到另一个接口的过程。路由器可以连接多个逻辑分来的网络。
我们需要将各个组件 module 看作一个个不同的网络。而 Router(路由器) 就是连接各个模块中界面跳转的中转站。这个中转站还可以拦截不安全的跳转或者设置一些特定的拦截服务。
- 添加依赖和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
dependencies {
// 替换成最新版本, 需要注意的是api
// 要与compiler匹配使用,均使用最新版可以保证兼容
compile 'com.alibaba:arouter-api:x.x.x'
annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
...
}
- 在 自定义的 Application 初始化 SDK
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (isDebug()) { // 这两行必须写在init之前,否则这些配置在init过程中将无效
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(this); // 尽可能早,推荐在Application中初始化
}
private boolean isDebug() {
return BuildConfig.DEBUG;
}
}
- 在 base module 创建
ARouterConfig统一各模块间的跳转规则。
public interface ARouterConfig {
/**
* 测试界面一
*/
String APP_TEST_ACT = "/app/TestActivity";
}
- 在 Activity 上方添加注解
@Route(path = ARouterConfig.APP_TEST_ACT)
public class TestActivity extends AppCompatActivity {
......
}
- 简单跳转
public void onTestActivityClick(View view) {
ARouter.getInstance()
.build(ARouterConfig.APP_TEST_ACT)
.navigation();
}
- 解析参数
@Route(path = ARouterConfig.APP_TEST_ACT)
public class TestActivity extends AppCompatActivity {
/**
* 为每一个参数声明一个字段,并使用 @Autowired 标注
*/
@Autowired
String name;
@Autowired
int age;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
// ARouter 会自动对字段进行赋值,无需主动获取
ARouter.getInstance().inject(this);
((TextView) findViewById(R.id.tv_show)).setText(String.format(" name: %s%n age:%s", name, age));
}
}
- 带参数跳转
public void onTestPClick(View view) {
ARouter.getInstance()
.build(ARouterConfig.APP_TEST_ACT)
.withString("name", "Demon")
.withInt("age", 18)
.navigation();
}
- 示例代码地址 TestARouter
参考
- Android 组件化架构-第二章-2.3 隐式跳转
- ARouter 文档