简书地址:https://www.jianshu.com/p/2f8a960ac6d8
阿里巴巴开源的路由:https://github.com/alibaba/ARouter
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()]
}
}
}
}
这样 各个模块的配置就统一了。
在 Application 中初始化:
@Override
public void onCreate() {
super.onCreate();
ARouter.openLog(); // 打印日志
ARouter.openDebug(); // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
ARouter.init( this ); // 尽可能早,推荐在Application中初始化
}
//地址最少两级 /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字段,废弃功能)
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");
}
}
这样就得到了传过来的值。
要跳转到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();
}
可以写一个 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();
}
}
在 清单文件配置
<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 还有很多更厉害的功能,还在逐步学习中。